✍OOP(Object Oriented Programming)
Java는 객체지향언어로 여기서 말하는 객체(Object)란,
사물, 동물, 사람 , 공기, 개념처럼 '사람이 인지할 수 있는 무언가' 라고 할 수 있다.
ex) 사람(object)이 문(object)을 열었다.(상호작용) -> 결과: 문이 열린다(사건)
Object와 Object가 상호작용을 했더니 사건이 발생했다.
- 각 객체마다 각자 가지고 있는 기능과 속성이 있고, 다른 객체와 상호작용하면서 필요한 결과를 도출할 수 있다.(여러기능 수행)
- 현실에 존재하는 독립적이면서 하나로 취급되는 사물이나 개념으로 객체 지향 언어에서 객체의 개념은 클래스에 정의된 내용대로 메모리에 할당된 결과물(Object)
1. 객체 지향의 특징
1) 캡슐화 (Encapsulation)
2) 상속 (Inheritance) + 추상화 (Abstraction)
3) 다형성 (Polymorphism)
+ 정보 은닉
2. 객체 지향 언어
객체 : Object끼리 Object간의 상호작용으로 사건이 발생한다라는 개념을
지향 : 컴퓨터 안에 구현하는 것을 목표로 하는
언어 : 프로그래밍 언어이다.
현실에서의 객체란?
: 자신의 속성(값, data)과 기능(동작,행동)이 다른 것들과 구분되어 식별 가능한 것 (object)
노트북 | 사람 | |
속성 | 색, 크기 등 | 나이, 이름, 키 |
기능 | 화면 출력, 소리 출력, 절전 모드, 화면 밝기 조정 |
말하다, 듣다, 쓰다, 식사하기, 운동하기 |
객체 지향 언어란
: 컴퓨터 내부에서 현실과 같은 객체간의 상호작용, 사건을 만들어 내는것을 목표로 하는 프로그래밍 기법
- 현실 세계는 사물이나 개념처럼 독립되고 구분되는 각각의 객체로 이루어져 있으며, 발생하는 모든 사건들은 객체간의 상호작용이다. 이 개념을 컴퓨터로 옮겨 놓아 만들어낸 것이 객체지향 언어이다.
ex) 자바
자바에서 객체(Object)란 ?
⭐: 클래스에 정의된 내용대로 new 연산자를 통해 메모리 영역(Heap)에 생성된 것, 객체를 만들기 위해서 설계도(클래스)가 필요
배열에 값을 넣을 수 있는데 그 값은,
값 == data == 속성
3. ⭐Class(클래스)⭐
객체의 특성(속성, 기능)을 정의한 것으로, 객체를 만들기 위한 설계도이다.
== 클래스안에 속성, 기능을 작성해야한다
변수: 값을 저장할 수 있는 작은 공간으로 1개의 자료형과 1개의 데이터만 저장 가능
ex) int a = 10;
↓
배열: 여러개의 변수들의 묶음으로 1개의 자료형+ 여러개의 데이터
↓
구조체: 여러 개의 자료형 여러 개의 데이터
ex)나이(int) 키(double) 재산(long)
⭐[클래스 작성 시 반드시 필요한 것 ]⭐
객체를 만들려면 class가 있어야하는데 class를 작성하기 위한 규칙인
객체지향언어의 특징이 적용 되어야한다. (추상화, 캡슐화)
1) 추상화
유연성을 확보하기 위해 구체적인 것은 제거한다는 의미 작성하려는 클래스의 속성과 기능 중
프로그램에서 필요한 공통점을 추출하고, 불필요한 부분을 제거하는 과정
반대: 구체화'
유연성: 무엇이든 만들수 있다는 의미
추상화라는 특징때문에 (공통된) 속성, (공통된) 기능이 들어가야한다.
ex) 책이 가질 수 있는 특징: 제목, 저자, 가격속성== 값== 데이터 public String title; //제목 public String author; //저자 public int price; // 가격
➡ public 외부에서 접근 가능한 기능이라는 뜻
public void bookinfo() { System.out.printf("%s 책의 저자는 %s 이며, 책의 가격은 %d 입니다.\n", title, author, price ); }
=> 출력은 되지만 캡슐화 되지 않은 코드
➡ 추상화만 된 상태로 객체를 만들면 외부에서 접근이 쉬워진다는 문제가 생긴다. (객체의 손상)
캡슐화를 통해 외부에서의 접근을 차단, 그러면서 정보 은닉의 효과도 같이 발생
public (공공의,드러난) : 어디서든지 누구든지 접근 가능함을 나타냄
private (사적인) :해당 객체 내부에서만 사용 가능(외부 접근 불가)
2) 캡슐화
추상화를 통해 정리된 데이터들과 기능을 하나로 묶어 관리하는 기법 클래스의 가장 중요한 목적인
데이터의 직접 접근제한을 원칙으로 하여 클래스 외부에서 데이터의 직접적인 접근을 막고,
대신 간접적으로 데이터에 접근할 수 메소드를 클래스 내부에 작성하는 방법
직접접근 차단 정보 보호
ex) { }도 캡슐화 중 하나
-클래스-
필드
메소드
// 필드에 직접 접근하지 못하게 막는다.
캡슐화라는 특징때문에 캡슐화해서 보호하고 가려서 정보 은닉을 한다.
ex) 감기약 처럼 구체적인 기능은 몰라도 어떤 기능을 하는지 알 수 있다.
private String title; //제목 private String author; //저자 private int price; // 가격
➡ private : 직접접근이 제한된 객체의 속성부분을 객체 내에서만 접근 가능하게 캡슐화 한다.
➡ 속성에 private 추가하여 외부로부터의 직접 접근을 차단 == 캡슐화
➡ 캡슐화하는 이유 : 객체의 손상을 막기 위해서한다.
➡ 캡슐화했을때 내부와 연결할 수있는 통로를 만들어야한다. 속성에 직접접근이 안되므로 간접접근 방법을 제공
---> 간접 접근 기능(getter / setter)이 필요
기능 == 동작 == 수행 public void knowledgeTransfer() {//지식의 전달 기능 } //String title : 제목 public void setTitle(String title) { this.title = title; } public String getTitle() { return title; } //String author : 저자 public void setAuthor(String author) { this.author = author; } public String getAuthor() { return author; } //int price : 가격 public void setPrice (int price) { this.price = price; } public int getPrice() { return price; }
🔎 직접 접근 막으면서 간접 접근을 할 수 있는 기능을 사용하는 코드
1. ⭐getter⭐
: 값을 얻어갈 수 있게 하는 기능
getter 작성법
public 속성자료형 get속성명() {
return 속성명;
}
get속성명 적을때 속성명은 카멜표기법으로 작성
게터는 얻어가야하니깐 기본 자료형
👉String getTitle()
: String은 돌려 보낼 값의 속성 자료형 == 반환형
👉return : 호출한 곳으로 돌아감 == 반환
return title; 호출한 곳으로 돌아갈 때 title 속성값을 가지고 돌아간다.
-> 호출된 곳으로 돌아갈 때 title 속성에 저장된 값 ("어린왕자")을 가지고 돌아간다.
2. setter
: 속성별로 값을 세팅하는 기능
setter 작성 방법
public void set속성명 (속성자료형 속성명){
this.속성명 = 속성명;
}
세터는 반환값이 없으니 void
👉setTitle(String title)
: 매개변수로 전달받은 값을 저장하는 매개체
현재 객체의 title 속성은 private이지만 setTitle() 메소드도 같은 객체에 있으므로 접근 가능하다.
외부로부터 전달 받은 값을 저장할 매개체 == 매개변수
-> 외부로부터 전달 받은 값을 해당 기능 내부에서 name이라는 변수명으로 사용
👉void (공허,허공, 아무것도없다)
: 돌려보낼 반환 값이 없다 .
👉this (여기, 이것, 현재 객체)
: 현재 객체의 title 속성은 private이지만 setTitle() 메소드도 같은 객체에 있으므로 접근 가능
this 참조변수라고 부르는데 그 이유는, 객체의 시작 주소를 저장하고 있기 때문이다.
: 할당된 객체를 가리킨다 == 객체의 시작주소를 저장하고 있다
Book book1 = new Book(); //book1에 값 세팅 후 출력 book1.setTitle("어린왕자"); book1.setAuthor("생택쥐베리"); book1.setPrice(8000); System.out.println("제목 : " + book1.getTitle()); System.out.println("저자 : " + book1.getAuthor()); System.out.println("가격 : " + book1.getPrice());
Book객체를 생성하여 이를 참조하는 변수 book1에 주소를 대입
// class는 설계도 ==> 원하는기능을 수행할 수 없다
new 객체 : 완성품 -== 기능 수행
코드를 수행하는 클래스: EncapsulationService
EncapsulationRun
코드 출력하는 클래스
public class EncapsulationRun { public static void main(String[] args) {//메인 메소드 EncapsulationService service = new EncapsulationService(); service.example1(); //book1이 있는 클래스
자바에서는 new를 통해 객체가 생성된다.
주체는 외부로
외부에서 객체에 값을 넣는다 :setter
외부에서 안에있는 값을 얻어온다 : getter
=> 추상화를 통해서 정리된 속성과 기능을 하나로 묶고, 속성(데이터)의 직접 접근 방지를 하는 것. 이로 인해 부가적으로 정보 은닉 효과가 발생함
2) 객체(Instance)의 할당
객체화 == 인스턴스화
new 연산자와 생성자를 사용하여 객체 생성 시 Heap 메모리 영역에 서로 다른 자료형의 데이터가 연속으로 나열/할당된 객체 공간
Object =/= Instance (같지 않고 비슷하다.)
Object 와 Instance는 비슷하다.
'Backend > Java' 카테고리의 다른 글
[Java] OOP 3_Constructor(생성자) (0) | 2021.09.07 |
---|---|
[Java] OOP 2 _Class, Field (접근제한자, 예약어, 멤버·클래스 변수) (0) | 2021.09.07 |
[Java] Array(배열)_3 (배열 복사) (0) | 2021.09.03 |
[Java] 2차원 Array(배열) + 가변 배열/ 선언,할당,초기화 (0) | 2021.09.02 |
[Java] Array(배열)_String[] (null) (0) | 2021.09.02 |