- 캡슐화 (Encapsulation)
- 외부에 노출할 필요가 없는 정보들은 은닉 (정보은닉)
- 정보 은닉(information hiding): 필요가 없는 정보는 외부에서 접근하지 못하도록 제한하는 것
- 높은 응집도, 낮은 결합도를 유지하여 유연함과 유지보수성 증가
- ex) 마트에서 구매자는 상품명과 가격만 알면될 뿐, 뒤에 원재료와 재질각 종 다양한 정보는 몰라도 된다
필요한 정보만 보여주게끔 설계해야 된다는 의미- 추상화 (Abstraction)
- 객체의 공통된 속성들 중 필요한 부분을 포착해서 클래스로 정의하는 설계 기법
- 구체적인 사물들의 공통적인 특징을 파악해서 이를 하나의 개념(집합)으로 다루는 것
- 다형성(Polymorphism)
- 같은 형태이지만 다른 기능을 하는 것
- 서로 다른 클래스의 객체가 같은 메시지를 받았을 때 각자의 방식으로 동작하는 능력
- 오버라이딩(Overriding) 은 상위 클래스가 가지고 있는 메서드를 하위 클래스가 재정의해서 사용
- 오버로딩(Overloading) 은 이름의 메서드 여러개를 가지면서 매개변수의 유형과 개수가 다르도록 하는 기술
- 상속성,재사용(Inheritance)
- 부모 클래스가 자손 클래스에게 속성을 물려주는 것
- 코드의 재사용
- 여러 개체들이 가진 공통된 특성을 부각시켜 하나의 개념이나 법칙으로 성립시키는 과정
출처 - https://theheydaze.tistory.com/603
오버라이딩: 메소드를 덮어씌우는 과정
오버로딩: 같은 메소드를 사용하는데 각각의 다른 매개변수를 사용해서 두 개의 다른 메소드처럼 처리하는 것
class 오리 { // 부모클래스
}
// AB Test
// A is B
class 청둥오리 extends 오리 { // 자식클래스
}
복잡한 상속
class Main {
public static void main(String[] args) {
Parents p = new Parents();
p.a();
Child c = new Child();
c.a();
c.b();
// Child pc1 = new Parents(); // 에러 이유: 자식이 여러명의 친부모를 가질 수 없음
Parents pc2 = new Child(); // 부모는 여러 자식을 낳을 수 있음
pc2.a();
pc2.b(); // 에러 이유: 부모는 자식한테 물려받을 수 없으니, 자식이 가지고있는 함수를 받아 실행할 수 없음
// 형변환(casting) 되는 과정에서 Child객체가 Parents객체처럼 보여야하니, Child객체가 b메서드를 버리고 Parents처럼 보이게 함
// 버리지않고 가능하게 하고싶다면, Parents 클래스안에 b메서드를 넣어놓으면 됨. abstract void b();
// Parents 클래스를 abstract 클래스로 바꾸기.
// 실수 정수를 예로 들자면 - 정수는 실수안에 포함되지만, 실수가 정수안에 포함이 되진 않음
// A is B . AB Test
}
}
class Parents {
void a() {
System.out.println("a");
}
// abstract void b();
// 이거 사용하려면 클래스명도 앞에도 abstract로 바꿔야함
}
class Child extends Parents {
void b() {
System.out.println("b");
}
}
class Main {
public static void main(String[] args) {
Parents p = new Parents();
p.a();
Child c = new Child();
c.a();
}
}
abstract class Parents {
abstract void hi();
class Child extends Parents {
// 오버라이딩 해야함
void a() {
System.out.println("Hello");
}
}
class Main {
public static void main(String[] args) {
Parents p = new Parents();
p.a();
Child c = new Child();
c.a();
}
}
interface class Parents {
void a();
void b();
class Child implements Parents {
// 오버라이딩 해야함
void a() {
System.out.println("Hello");
}
void b() {
System.out.println("Bye");
}
}
// 문제 : 아래가 실행되도록 해주세요.
class Main {
public static void main(String[] args) {
사람인력관리소 a사람인력관리소 = new 사람인력관리소();
a사람인력관리소.add사람("홍길순", 33);
// 나이가 33살인 1번째 사람(홍길순)이 추가되었습니다.
a사람인력관리소.add사람("홍길동", 20);
// 나이가 20살인 2번째 사람(홍길동)이 추가되었습니다.
a사람인력관리소.add사람("임꺽정", 30);
// 나이가 30살인 3번째 사람(임꺽정)이 추가되었습니다.
사람 a사람1 = a사람인력관리소.get사람(1);
a사람1.자기소개();
// 저는 1번, 홍길순, 33살 입니다.
사람 a사람2 = a사람인력관리소.get사람(2);
a사람2.자기소개();
// 저는 2번, 홍길동, 20살 입니다.
사람 a사람3 = a사람인력관리소.get사람(3);
a사람3.자기소개();
// 저는 3번, 임꺽정, 30살 입니다.
}
}
// 문제 : 아래가 실행되도록 해주세요.
class Main {
public static void main(String[] args) {
사람인력관리소 a사람인력관리소 = new 사람인력관리소();
a사람인력관리소.add사람("홍길순", 33);
// 나이가 33살인 1번째 사람(홍길순)이 추가되었습니다.
a사람인력관리소.add사람("홍길동", 20);
// 나이가 20살인 2번째 사람(홍길동)이 추가되었습니다.
a사람인력관리소.add사람("임꺽정", 30);
// 나이가 30살인 3번째 사람(임꺽정)이 추가되었습니다.
사람 a사람1 = a사람인력관리소.get사람(1);
a사람1.자기소개();
// 저는 1번, 홍길순, 33살 입니다.
사람 a사람2 = a사람인력관리소.get사람(2);
a사람2.자기소개();
// 저는 2번, 홍길동, 20살 입니다.
사람 a사람3 = a사람인력관리소.get사람(3);
a사람3.자기소개();
// 저는 3번, 임꺽정, 30살 입니다.
}
}
class 사람인력관리소 {
사람[] 사람들 = new 사람[100];
// 전역변수를 사용해서 제대로 된 저장소를 만들면 add사람 함수 안에 있는 사람들의 정보를 꺼내와서 저장할 수 있다
// 그치만 사람이 올때마다 추가해줘야하는 번거로움이 있으니 배열객체를 만들면 조금 더 낫다
// 사람 a사람0;
// 사람 a사람1;
// 사람 a사람2;
int 마지막사람의번호 = 0;
void add사람(String 이름, int 나이) {
int 번호 = 마지막사람의번호 + 1;
사람 a사람 = new 사람(); // 사람들의 정보를 저장해서 사용 할 저장소를 만들기
// 객체말고 int 이름; 이런식으로 저장하면 한사람의 정보들이 흩어진다.
// 그러나 저장하는 행위는 안함. 정보의 조립을 한거다.
a사람.이름 = 이름;
a사람.나이 = 나이;
a사람.번호 = 번호;
사람들[번호 - 1] = a사람;
// if (번호 == 1) {
// a사람0 = a사람;
// } else if (번호 == 2) {
// a사람1 = a사람;
// } else if (번호 == 3) {
// a사람2 = a사람;
// }
System.out.printf("나이가 %d살인 %d번째 사람(%s)이 추가되었습니다.\n", 나이, 번호, 이름);
마지막사람의번호 = a사람.번호;
}
사람 get사람(int 번호) {
// if (번호 == 1) {
// return a사람0;
// } else if (번호 == 2) {
// return a사람1;
// } else if (번호 == 3) {
// return a사람2;
// }
return 사람들[번호 - 1];
}
}
class 사람 {
String 이름;
int 번호;
int 나이;
void 자기소개() {
System.out.printf("저는 %d번, %s, %d살 입니다.\n", 번호, 이름, 나이);
}
}
사람 get사람(int 번호) {
// return null;
return new 사람(); // 일단 이렇게 객체하나 return해놓고 문제를 더 풀어가보기
}
- "저는 0번, null, 0살 입니다."
이런식으로 디폴트값만 나와서 멘붕...