상속(IS-A) : ~는 ~이다
기존 클래스를 재사용하여 새로운 클래스를 작성하는 것
상위 클래스의 멤버를 하위 클래스에게 내려주는 것으로 하위 클래스는 상위 클래스로부터 확장된 것이다.
공통적인 속성과 기능을 가지고 있을 때 상속을 하는 것이 적합하다.
→ 보다 적은 양의 코드로 새로운 코드를 작성할 수 있다(코드의 재사용) : 중복 제거
→ 하나의 객체가 여러 모양으로 표현될 수 있다 : 다형성
class LowerClass extends UpperClass {}
extends로 상속할 상위 클래스 명을 적어 상속할 수 있다. 하위 클래스는 상위 클래스로부터 확장된 것이고, 상위 클래스에 있는 모든 속성들과 기능들을 사용할 수 있게 된다. 상속 후 하위 클래스의 개별적인 속성과 기능들은 객체 생성 후, 개별적으로 정의해줄 수 있다.
*단일 상속만이 허용된다. //다중 상속과 비슷한 효과를 내는 인터페이스라는 게 있다. > 나중에 학습!
*상속을 받은 경우, 하위 클래스로부터 인스턴스를 생성하면 상위 클래스의 인스턴스도 생성될까? → No, 상위 클래스의 인스턴스에 이어 붙여진다고 이해하자
포함 관계(HAS-A) : ~는 ~를 가지고 있다
상속처럼 클래스를 재사용할 수 있게 해준다. 클래스의 멤버로 다른 클래스 타입의 참조 변수를 선언한다.
상속과 포함의 차이?
알 것 같으면서 모르는 것 같고 복잡하다. 아직 모르는 용어가 많으니까, 지금은 상속은 IS-A, 포함은 HAS-A 정도로 정리하고 더 학습 한 뒤에 이해해보도록 하자.
메서드 오버라이딩
상위 클래스로부터 상속받은 메서드와 동일한 이름의 메서드를 재정의하는 것
하위 클래스에서 상위 클래스로부터 상속받은 메서드를 하위 클래스의 목적이나 용도에 맞춰 재정의 하는 것을 말한다.
**메서드 오버라이딩의 조건
1. 메서드의 선언부-(반환 타입, 메서드 이름, 매개 변수)가 상위 클래스의 메서드와 완전히 일치할 것
2. 접근 제어자의 범위는 상위 클래스의 메서드보다 같거나 넓어야 한다
3. 상위 클래스의 메서드보다 예외를 많이 선언할 수 없다
super
상위 클래스의 객체를 불러오기 위해서!
상속 시 하위 클래스가 상위 클래스와 동일한 필드명을 가질 때 구분을 위해 super 를 사용한다.
class Upper {
int count = 10; //상위 클래스에서 count 변수에 10을 대입
}
class Lower extends Upper {
int count = 7; //하위 클래스에서 count 변수에 7을 대입
void callNum(){
System.out.println("count = " + count); //필드에 할당된 값 7를 불러옴
System.out.println("this.count = " + this.count); //자신의 객체의 count = 7
System.out.println("super.count = " + super.count); //상위 클래스의 count
}
}
Upper 클래스를 상속받은 Lower 클래스는 상위 클래스(Upper)와 같은 필드명을 사용하였다. 이때, callNum() 메서드에서 상위 클래스의 변수를 참조하기 위해서 super.count를 사용해주었다. super를 사용하지 않으면 메서드는 자신이 속한 인스턴스 객체의 멤버를 먼저 참조하게 된다!
따라서 메인 메서드에서 callNum() 메서드를 호출하면 출력은 차례로 7, 7, 10이 나온다.
super()
상위 클래스의 생성자를 불러오기 위해서!
super()는 this()와 생긴 것도, 사용하는 방법도 매우 유사하다. 하위 클래스에서 상위 클래스의 생성자를 불러오기 위해 사용한다는 것만 다르고, 생성자 안에서만 사용해야 한다는 점과 반드시 첫 줄에 나와야 한다는 점은 모두 this()의 특징과 같다.
Object 클래스
자바의 클래스 상속 계층도에서 최상위에 위치한 상위 클래스
사실 자바의 모든 클래스는 Object 클래스를 상속받고 있었다. 상속을 받지 않는 클래스에게는 자동으로 extends Object가 추가되고, 결과로 Object 클래스의 멤버들을 자동으로 상속받아 사용할 수 있었다. 또한 Ojbect 클래스는 계층도상 최상위 위치이므로 따로 메서드의 정의 없이 사용 가능하다.
지금까지 사용해온 toString()과 equals() 역시 Object 클래스의 대표 메서드이고 외에도 차차 배워갈 hashCode(), wait(), notify() 등이 있다.
캡슐화
특정 객체 안에 관련된 속성과 기능을 하나의 캡슐로 만들어, 데이터를 외부로부터 보호하는것
캡슐화의 목적은 내부적으로 사용되는 데이터의 불필요한 외부 노출을 방지해 데이터를 보호하는 데에 있다. 캡슐화를 통해 외부로부터 객체의 속성과 기능이 함부로 변경되는 것을 막고, 변경이 되더라도 다른 객체에 영향을 주지 않는 독립성을 유지할 수 있다.
→ 코드 확장 시 오류 범위를 최소화할 수 있어 유지보수 측면에서 이점을 갖는다!
패키지
특정한 목적을 공유하는 클래스와 인터페이스의 묶음 like 폴더
패키지는 클래스를 그룹 단위로 묶어 효과적으로 관리하기 위한 목적으로 사용된다. 패키지로 인해, 협업 시에 클래스끼리 같은 이름을 가지고 있더라도 다른 패키지에 포함되어 있으면 구별이 가능해 충돌을 방지할 수 있다.
다른 패키지의 클래스를 사용하기 위해서는 다른 패키지에서 클래스를 불러오는 작업이 필요한데 이를 간소화할 수 있게 해주는 것이 import문이다.
import 패키지명.클래스명;
import *;
위와 같은 형태로 사용되어 특정한 클래스만 불러오거나, 패키지에 포함된 모든 클래스를 불러올 수 있다. import문은 패키지 구문과 클래스문 사이에 작성되고, 컴파일 시에 처리되므로 프로그램의 성능에는 영향을 미치지 않는다.
제어자
제어자는 클래스, 필드, 메서드, 생성자 등에 부가적인 의미를 부여하는 키워드로, 접근 제어자와 기타 제어자로 나뉜다.
- 접근 제어자: public > protected > default > private
- 기타 제어자: static, final, abstract, native, transient, synchronized
하나의 대상에서 여러 제어자를 사용하는 것이 가능하지만, 접근 제어자는 단 한번만 사용해야 한다는 것에 주의한다.
접근 제어자
데이터 보호를 위해 사용되어, 클래스 외부로부터 불필요한 데이터 노출을 방지해 데이터가 임의로 변경되는 것을 막기 위해 사용된다
public
접근 제한을 두지 않는다. 제한 없이 어디에서나 사용 가능하다.
protected
동일한 패키지 내부에서 제한 없이 사용할 수 있고, 외부 패키지에서는 상속 받은 하위 클래스에서만 사용 가능하다.
default
동일한 패키지 내부에서만 사용 가능하다. 접근 제어자를 명시해주지 않았을 때 기본으로 지정된다.
private
동일한 클래스 내부에서만 사용 가능하다.
캡슐화의 목적은 데이터를 외부로부터 보호해 불필요한 노출을 방지하고, 외부로부터 객체의 속성과 기능이 함부로 변경되지 못하게 막는 데 있다고 하였다. 이를 위해서 사용하는 것이 접근 제어자이다. 하지만 캡슐화의 목적을 해치지 않으면서도 데이터를 변경하는 방법이 없을까? 이때 사용하는 것이 getter와 setter 메서드이다.
데이터 보호와 정보 은닉을 목적으로 private으로 선언된 필드 값을 변경하고자 할 때, 일반적인 방법으로는 불가능하지만 getter와 setter 메서드를 이용하면 데이터의 속성과 기능을 유지하면서 다른 객체에 영향을 주지 않게 할 수 있다.
setter
외부에서 메서드를 호출해 조건에 맞을 경우 데이터 값을 변경하게 해준다.
public 리턴타입 set메서드명() {}
조건에 맞을 경우 값을 변경하게 해준다는 것은, 데이터를 변경하게는 해주겠지만 데이터의 속성과 기능은 지키겠다는 의미이다. 이때 setter 메서드 안에 조건문을 사용해 원하지 않는 데이터는 거를 수 있다.
getter
외부에서 메서드를 호출해 setter를 통해 변경한 데이터를 읽어온다.
public 리턴타입 get메서드명(){}
getter와 setter 메서드의 가장 큰 이점은 캡슐화와 정보 보호 측면에 있다. private으로 선언한 필드는 외부에서 절대 접근하지 못하기 때문에 잘못된 데이터의 접근이 불가능하게 되고, 클래스 사용 시에 내부 동작을 따로 알지 못해도 setter를 통해서 선조건을 걸어줄 수 있으므로 유용하다.
🐑 Daily 회고
1. 머리가 핑핑 돌아요
- 이해한 것 같다가도 책을 보거나 문제를 풀려고 하면 일시정지다
- 더 더 더 더 더더더 공부합니다 ㅠ
2. 이제 다시 일찍 자자
- 역시 낮에 일하는 게 효율이 좋다
총평 ⭐⭐
자바 기본서들이랑은 언제쯤 작별할 수 있을까? 분명히 봤던 내용 또 보는데도 완벽하게 안다는 느낌이 안 든다.
'diary > codestates (be39)' 카테고리의 다른 글
05/16/22 (복습) 데일리 회고 (0) | 2022.05.17 |
---|---|
05/13/22 java/ 다형성과 추상화 (0) | 2022.05.14 |
05/11/22 java 생성자 + 이력서 특강 (0) | 2022.05.12 |
05/10/22 객체에 관해서~ (0) | 2022.05.11 |
05/09/22 Daily 회고 (0) | 2022.05.10 |