1. 멤버변수 숨겨라
멤버변수 private
외부에서 수정 못하게 막음.
but 이렇게 하면 읽지 못함
-> Get함수를 만들어 멤버변수 값을 리턴 : 수정 막음.
but 오브젝트를 반환 할 경우 외부에서 바꿀 수 있음. ㅂㅅ
예시)
int GetAge() { return mAge; }
-> 사용자가 mAge값을 수정 못함.
멤버변수를 수정할 일이 있다면? Set함수를 만들어라.
void SetAge(int age) { mAge = age; }
그런데 어차피 읽고 수정가능하면 그냥 멤버변수를 public으로 하면 돼지 왜 귀찮게 get set 만들까?
자바는 병신이라 unsigned가 없어서 그럼
mAge = -1; 하면 나이가 -1살됨.
하지만 Set함수를 만들면 age > 0 때만 값을 바꾸게 할 수 있다.
2. 생성자
-> 오브젝트 생성 시 강제로 값을 부여함.
기본생성자는 매개변수 없이 생성자를 만듬.
자바는 멤버변수 값형은 0으로 자동으로 초기화 참조형은 NULL로 초기화됨.
하지만 너가 매개변수를 넣은 생성자를 만들면 기본 생성자는 사라짐. 못씀.
생성자는 클래스명. 반환형을 따로 안써줌.
Class A면 A()인 셈.
ex)
//default constructor
ClassName() //생성자 없을 경우 컴파일러가 알아서 만들어줌.
{
mPtr = NULL;
mValue = 0;
...
};
//custom
ClassName(int a) {....}
오브젝트 = new ClassName(); 하면 컴파일 에러남..custom 생성자를 만들어서 기본 생성자가 사라졌기 때문.
3. 멤버함수 (= 메서드)
오브젝트에서 호출하기 때문에 멤버변수를 사용할 수 있다.(private 포함)
매개변수로 들어온 같은 클래스의 오브젝트의 경우 private에 접근할 수 있다.
//대충 function이 Cat 클래스에 있단 소리 원래 C++문법
예) void Cat::function(Cat cat) {
cat.mAge = 3 //mAge가 private여도 컴파일 됨.
}
4. 상속
#include랑 개념적으로 비슷함.
Class name extends 부모클래스
부모 함수 다 가져옴.
C에서 헤더파일 보면 함수 시그내처 다 복사해두잖슴.
그거처럼 마찬가지로 부모 클래스의 public protected 함수 시그내처를 가져옴.(private는 안 가져옴) 이때 자식에서 구현하면 그 함수로 대체되고(오버라이딩) 안하면 부모 함수 그대로 사용함.
자바는 한부모 가정이라 한 명의 부모만 둠. 다중상속이 안됨.(다중 상속시 다이아몬드문제나 이런게 있긴 한데 지금은 몰라도됨)
+ 부모 멤버변수도 일부 쓸 수 있음. private인 경우는 안되고 protected이면..
부모 A를 상속한 자식 B가 있다고 치면
B의 인스턴스 b는 ( A / B )로 이루어짐. 걍 부모를 옆에 에드온처럼 달고다닌다고 생각하셈. 별개가 아님.
5. 인터페이스
동일한 함수 시그내처를 공유하는 목록
- implements 를 사용함. 사용법은 상속처럼 클래스 뒤에
근데 상속때는 부모가 구현했자나. 근데 인터페이스는 구현이 안되있어 시그내처밖에 없어.
그래서 자식에서 안하면 함수 정의만 되어 있고 원형이 없어서 컴파일 안됨.
- abstract class에서 멤버변수 없는게 인터페이스임
(abstract class는 일부 함수 구현이 안된 클래스임. 그래서 인스턴스를 못만듬. 왜? 정의되지 않은 클래스니까. 그럼 왜 있냐고? 부모로 두고 상속해서 쓰라고)
6. 다형성
4, 5하는 이유가 이거 때문임.
//자바에서 오브젝트는 무조건 동적할당
Parent inst1 = new Child();
Parent inst2 = new Child2();
inst1이랑 2는 사실 서로 다른 클래스임. 하지만 둘다 Parent로 처리함.
이게 좋은 점은
Parent배열에 inst1, 2를 넣으면 한번에 처리할 수 있어서 그럼 arry배열에 넣고 처리한다고 쳐보자.
for문 arry[i].action -> inst1은 child()에 있는 action을 inst2은 child()에 있는 action을 수행함.
삼성(자식1)이든 LG(자식2)든 전원 누르면 각각 티비(부모) 켜짐.(티비에 있고 자식에 override된 함수)
이거면 객체지향 기본은 끝이라 생각함.
더 깊은 건 알아서 공부하셈.
전공자는 당연히 알거고 ㅋㅋㅋ
비전공자는 객체지향 끝 하면 됨. 접근제어자나 final class나 기타 잡것들은 필요하면 보면서 하면 됨. 어차피 틀리게 만드는 게 목적인 시험 볼거 아니니까. 이 정도만 알아도 프로그래밍 할 수 있다 생각함.
멤버변수 private
외부에서 수정 못하게 막음.
but 이렇게 하면 읽지 못함
-> Get함수를 만들어 멤버변수 값을 리턴 : 수정 막음.
but 오브젝트를 반환 할 경우 외부에서 바꿀 수 있음. ㅂㅅ
예시)
int GetAge() { return mAge; }
-> 사용자가 mAge값을 수정 못함.
멤버변수를 수정할 일이 있다면? Set함수를 만들어라.
void SetAge(int age) { mAge = age; }
그런데 어차피 읽고 수정가능하면 그냥 멤버변수를 public으로 하면 돼지 왜 귀찮게 get set 만들까?
자바는 병신이라 unsigned가 없어서 그럼
mAge = -1; 하면 나이가 -1살됨.
하지만 Set함수를 만들면 age > 0 때만 값을 바꾸게 할 수 있다.
2. 생성자
-> 오브젝트 생성 시 강제로 값을 부여함.
기본생성자는 매개변수 없이 생성자를 만듬.
자바는 멤버변수 값형은 0으로 자동으로 초기화 참조형은 NULL로 초기화됨.
하지만 너가 매개변수를 넣은 생성자를 만들면 기본 생성자는 사라짐. 못씀.
생성자는 클래스명. 반환형을 따로 안써줌.
Class A면 A()인 셈.
ex)
//default constructor
ClassName() //생성자 없을 경우 컴파일러가 알아서 만들어줌.
{
mPtr = NULL;
mValue = 0;
...
};
//custom
ClassName(int a) {....}
오브젝트 = new ClassName(); 하면 컴파일 에러남..custom 생성자를 만들어서 기본 생성자가 사라졌기 때문.
3. 멤버함수 (= 메서드)
오브젝트에서 호출하기 때문에 멤버변수를 사용할 수 있다.(private 포함)
매개변수로 들어온 같은 클래스의 오브젝트의 경우 private에 접근할 수 있다.
//대충 function이 Cat 클래스에 있단 소리 원래 C++문법
예) void Cat::function(Cat cat) {
cat.mAge = 3 //mAge가 private여도 컴파일 됨.
}
4. 상속
#include랑 개념적으로 비슷함.
Class name extends 부모클래스
부모 함수 다 가져옴.
C에서 헤더파일 보면 함수 시그내처 다 복사해두잖슴.
그거처럼 마찬가지로 부모 클래스의 public protected 함수 시그내처를 가져옴.(private는 안 가져옴) 이때 자식에서 구현하면 그 함수로 대체되고(오버라이딩) 안하면 부모 함수 그대로 사용함.
자바는 한부모 가정이라 한 명의 부모만 둠. 다중상속이 안됨.(다중 상속시 다이아몬드문제나 이런게 있긴 한데 지금은 몰라도됨)
+ 부모 멤버변수도 일부 쓸 수 있음. private인 경우는 안되고 protected이면..
부모 A를 상속한 자식 B가 있다고 치면
B의 인스턴스 b는 ( A / B )로 이루어짐. 걍 부모를 옆에 에드온처럼 달고다닌다고 생각하셈. 별개가 아님.
5. 인터페이스
동일한 함수 시그내처를 공유하는 목록
- implements 를 사용함. 사용법은 상속처럼 클래스 뒤에
근데 상속때는 부모가 구현했자나. 근데 인터페이스는 구현이 안되있어 시그내처밖에 없어.
그래서 자식에서 안하면 함수 정의만 되어 있고 원형이 없어서 컴파일 안됨.
- abstract class에서 멤버변수 없는게 인터페이스임
(abstract class는 일부 함수 구현이 안된 클래스임. 그래서 인스턴스를 못만듬. 왜? 정의되지 않은 클래스니까. 그럼 왜 있냐고? 부모로 두고 상속해서 쓰라고)
6. 다형성
4, 5하는 이유가 이거 때문임.
//자바에서 오브젝트는 무조건 동적할당
Parent inst1 = new Child();
Parent inst2 = new Child2();
inst1이랑 2는 사실 서로 다른 클래스임. 하지만 둘다 Parent로 처리함.
이게 좋은 점은
Parent배열에 inst1, 2를 넣으면 한번에 처리할 수 있어서 그럼 arry배열에 넣고 처리한다고 쳐보자.
for문 arry[i].action -> inst1은 child()에 있는 action을 inst2은 child()에 있는 action을 수행함.
삼성(자식1)이든 LG(자식2)든 전원 누르면 각각 티비(부모) 켜짐.(티비에 있고 자식에 override된 함수)
이거면 객체지향 기본은 끝이라 생각함.
더 깊은 건 알아서 공부하셈.
전공자는 당연히 알거고 ㅋㅋㅋ
비전공자는 객체지향 끝 하면 됨. 접근제어자나 final class나 기타 잡것들은 필요하면 보면서 하면 됨. 어차피 틀리게 만드는 게 목적인 시험 볼거 아니니까. 이 정도만 알아도 프로그래밍 할 수 있다 생각함.
댓글 0