객체지향 프로그래밍과 OOP의 3대 컨셉 (1. Encapsulation(캡슐화, 은닉화)-private/setter/getter)


객체지향 프로그래밍

Class는 Java program의 단위입니다.

객체(오브젝트)classinstance(산물, 생산물)입니다.
-더 구체적으로는 메모리상에 올라가는 data+method라고 합니다. (구체적 정보)

현실로 비유를 해보죠

모니터를 찍어내는 틀클래스
생산된 모니터 인스턴스(객체)
그런데 일반적인 상식으로 객체라고 하는 것은 실 세계의 모든 구체적이고도 관념적 사물을 말합니다.
우리 모두 객체, 책상, 칠판, 등등 모두 객체라고 할 수 있죠
그렇지만 빔프로젝터에서 나오는 빔은 우리가 손으로 가리킬 수 없죠? 바로 관념적인 개념이기 때문입니다.
형광등은 우리가 손으로 가르킬 수 있지만 형광등에서 나오는 빛은 손가락으로 가르킬 수 없지만 그럼에도 존재합니다.

그렇다면 객체입니다.
사랑을 손가락으로 가르킬 수 없지만 이것도 객체입니다.

즉, 생각할 수 있다면 모두 객체입니다.
구매라고 하는 것은 손가락으로 가르킬 수 없지만 그럼에도 객체라고 부릅니다.
보이는 것이든 보이지 않는 것이든 생각할 수 있는 모든 것을 객체라고 할 수 있습니다.

다만 프로그램에서는 모든 사물이 필요한 것이 아니므로 필요한 것만 추려야합니다.



객체지향 프로그래밍의 특징은 3가지가 있습니다.
이를 OOP의 3대 컨셉이라고 합니다.

   1.캡슐화(Encapsulation) - 은닉화라고도 부름
   2상속 (Inheritance)
   3. 다형성(Polymorphism)


이번 글과 다음 글에선 캡슐화에 대해서 다루겠습니다.
캡슐화란, data 보호 장치입니다.

예를 들어보겠습니다.


class MyProfile {
  String name = “조정식
  int age = 28;
}

class Test {
publie static void main(String [ ] agrs){
//객체화해야한다.
 MyProfile m = new MyProfile( );
//m을 통해서 출력
System.out.println(m.name +”:” +m.age); //조정식:28 출력
m.age = 1000; // 에러 안난다.
System.out.println(m.age); // 1000 출력
  }

}

코드에는 이상이 없지만 현실적으로 사람 나이가 1000이 들어가는게 말이 안되죠?
이 경우에는 에러가 안나서 문제입니다.


이러한 경우를 대비해서 개발자가 코드를 잘 짜야하는 것입니다.

값을 줘도 에러가 안나면 프로그램이 의미론적으로 맞지 않게 돌아갈 수 있습니다
사용자보고 잘 써라는게 아니라 개발자가 남이 잘 사용할 수 있게 짜야합니다
(재사용-reuse)


보호를 어떻게 하냐면 데이터타입 앞에 private를 붙입니다.
data – private
setter/getter - public



private은 접근제한자로 일단은 금고라고 생각하시면 됩니다.
아무도 모르는 자신만의 금고요.

보호를 원하는 데이터 타입 앞에 private를 붙입니다.
우린 나이를 보호할 것이기 때문에 
private int age로 하면 되겠습니다.

보호하기 위해선 setter와 getter메소드를 사용할 건데 
값을 세팅하는 쪽은 setAge(boolean형인 경우 set대신 is라고 쓴다.)
값을 받는 쪽(외부에서 접근)은 getAge라고 써줍니다.
보통 보호하기 위한 데이터 앞에 set과 get을 쓰고 변수이름의 첫글자를 대문자로 시작하시면 됩니다.

set메소드에서는 유효성 검사를 합니다.
(나이를 기준으로 1살부터 89살까지 산다고 가정해봅시다. 
그럼 1살~89살인 나이에 대해서만 age를 주겠다는 뜻입니다.)
여기선 리턴할 것이 없으므로 void를 씁니다.

get메소드는 외부에서 접근하도록 허용하는 메소드 이구요.
리턴해주는 메소드이고 우린 나이를 썼으므로 리턴타입은 int입니다.

결과 값을 확인해보면 age를 -100으로 넣는 것에 대해서는 무시하는 것을 확인하실 수 있습니다.

get과 set메소드를 자동으로 만들어주는 방법은 이클립스 기준으로 다음과 같습니다.




댓글 없음:

Powered by Blogger.