IT/JAVA

[DAY 11] 캡슐화, 상속, 오버라이딩, Object 클래스

_KH_ 2025. 1. 14. 17:49

[캡슐화]

: 외부에서 건들 수 없도록 함.

   객체 외부인 메인에서 객체 내부에 너무 쉽게 접근할 수 없도록 직접 접근을 막는다.
-> 클래스에서 멤버변수의 접근제한자를 public에서 private로 바꾸면 에러 발생! 객체 정보에 접근할 수 없게 된다 .
==> "하이딩(정보은닉)"

 

  "접근자", "접근제한자"
---> 크게 보면 private(전부 가리기), public(전부 공개)

 

  main은 반드시 public이 원칙.

   "getter"  : 캡슐화된 (=정보가 은닉된, 정보가 하이딩된)  멤버변수의 값을 가져오고 싶을 때 사용
1)  getter는 가져올 수 있는 메서드이기 때문에 반드시 public으로 선언
2) getXXX - (get멤버변수명) 으로 이름 작성.
3) 리턴값 o

 

■   "setter"  :캡슐화된 멤버변수에게 새로운 값을 부여하고 싶을 때 사용
1) 역시나 public으로 선언.

2) 리턴값 x (setter는 반환형이 void로 고정)

public void SetScore(int score) {
	this.score =score; 
}


■  생성자는 멤버변수를 초기화하는 것. setter도 멤버변수에 값을 부여하는 것. 둘이 비슷함

■  메서드를 호출하면 로그에 다 흔적이 남는데,  멤버접근연산자(get/set)는 흔적이 안남는다. 
로그가 남는 메서드를 쓰는 것이 더 안정적

■  우클릭 -> source -> generate -> getter/setter  (사용이 잦은 메소드들을 자바가 구현해놓았다.)

■  private를 걸어두면 자동생성에 빨간색으로 뜸!! -> 같은 클래스 안에서는 사용이 가능하다.

[상속]

class Dog extends Animal


예를 들어, animal 클래스에는 dog 클래스, cat 클래스가 포함될 수 있다.
상위 클래스를 만들어 하위 클래스에서 가져다 쓸 수 있도록 한다.

■ 상위 클래스 == 부모 클래스
■ 하위 클래스 == 자식 클래스 == 파생 클래스

■ 상속은 하나밖에 못받음. 자바는 다중상속 안됨 -> 인터페이스 써도 안됨!!

■ private 접근제한자를 붙이면 자식도 못쓴다. ==> 자식까지 쓰게 하려면 protected를 사용할 수 있다.
-> 근데 실무에서는 protected를 사용하지 않는다.

■  부모 클래스에서 생성자를 만들면 자식 클래스의 기본 생성자에 에러가 발생한다.

"자식 클래스의 모든 생성자는 무조건! 가장 먼저! 부모의 기본 생성자를 호출함" ★★★★

■ 부모클래스에게 기본 생성자가 없다면 자식 클래스에서는 에러가 발생함!! ★★

-> 해결 방법
1) 부모 클래스에게 기본 생성자를 선언
2) 자식 클래스의 생성자에서 부모 클래스가 가지고 있는 다른 생성자를(인자가 있는) 호출하면 된다. 
---> 2번으로 해결하는 것이 좋음! 부모의 다른 생성자를 불러서 해결!

생성자 이슈가 상속에서 가장 중요한 이슈다!★★★★★★★★★★
 
■ this() -> 자기자신 객체
■ super() -> 부모 호출

class Point {
int x;
int y;

Point(int x, int y) {
// 부모에 생성자 추가하면 자식에게 에러 발생 -> 기본 생성자 때문에 생기는 에러
this.x = x;
this.y = y;
}
}

class ColorPoint extends Point{
String color; // 이미 개발된 Point를 가져오면 x,y 생성 필요 없음

ColorPoint() { // 기본 생성자. 에러의 원인
// -> 부모의 기본 생성자를 호출해야하는데 부모의 기본 생성자가 없기 떄문이다.


}
}

 

   생성자는 인자가 더 많은 쪽을 구현한 후 다른 쪽에서 가져다가 사용 this();
  클래스 변수(static)에는 = 로 값 초기화해줘도 ok

[오버라이딩]
: 부모 클래스가 가진 메서드를 자식 클래스의 특성에 맞게 재정의하는 것
== "메서드 재정의" == 오버라이딩 : 메서드 시그니쳐가 동일해야 하며, 상속관계에서만 발생한다!!!!!

Source -> override method 들어가서 오버라이딩 가능

   @Override : 어노테이션. 컴퓨터와 개발자에게 가독성을 증가시켜주는 기호
-> 부모가 가지고 있구나 ~ 하고 쉽게 알 수 ㅇ

   오버로딩과 오버라이딩 구분!!! 매개변수가 다르면 오버라이딩이 될 수가 없다. 메서드 시그니쳐가 완전히 동일해야 오버라이딩.

===> private 접근제어자 getter setter 캡슐화 상속 생성자 오버라이딩 super

static 객체와 무관하게
final 상수화

[Object 클래스] == 자바의 최상위 클래스
  자바에서 선언 및 생성하는 모든 클래스는 Object를 상속받는다.
  toString(), equals() 많이 사용 
  toString()이 자동호출 된다. -> 해쉬값(주소값)을 보여줌
  최상위 클래스 object의 toString()을 오버라이딩할수도 있다. (해쉬값 보기 싫으니까)

  Source -> generate toString() 존재

  toString()있으면 println말고 toString으로 사용 

   커스터마이징 할 거 아니면 보통 source -> generate toString()으로 생성한다.

멤버변수 => 생성자 => 메서드 => get/set => toString 순서

 

[해야할 것]

1) 코드 작성하면서 DEPTH 줄이기!!!!!!!! & 어떤게 더 효율적인 방법일지 고민
2) 가독성을 위해 this 빼먹지 않고 전부 다 쓰기!!!

 

오늘은 자바에서 굉장히 중요한 개념들을 배웠다. 자바의 핵심인 객체와 상속은 꼭!! 잘 숙지하고 넘어가도록 해야겠다.

'IT > JAVA' 카테고리의 다른 글

[JAVA] 객체배열 - 포켓몬 프로그램  (0) 2025.01.16
Java Section 08 : 메서드  (0) 2025.01.15
Java Section 07 : 클래스  (0) 2025.01.14
[Day 10] 객체와 생성자  (0) 2025.01.13
[Day 9] JAVA 객체  (0) 2025.01.10