기존 클래스를 재활용해 새 클래스를 작성하는 것
부모클래스(상위클래스)를 확장(상속)시켜 자식클래스(하위클래스)를 생성하는 것
상속을 하는 이유는?
1. 코드 재활용으로 중복 코드 작성을 하지 않아도 된다
2. 하나의 객체가 여러 모양으로 표현될 수 있는 다형성의 장점
class 하위클래스명 extends 상위클래스명 {
}
* 단일 상속(single inheritance)만을 허용! 다중상속 안돼!
| 포함 (composite)
기존 클래스에 다른 클래스를 참조변수로 선언해 사용
클래스 간의 관계에 따라,
- ~은 ~이다(IS-A) 관계 : 상속 // Progrmmer 는 Person 이다.
- ~은 ~을 가지고 있다(HAS-A) 관계 : 포함 // Employee 는 Address 를 갖는다.
| 메서드 오버라이딩 (Method Overriding)
상위클래스 메서드를 상속받아 재정의하여 동일한 이름으로 재사용하는 것
조건
- 메서드의 선언부(메서드 이름, 매개 변수, 반환 타입)가 상위클래스의 그것과 완전히 일치해야 함
- 접근 제어자의 범위가 상위 클래스의 메서드보다 같거나 넓어야 한다.
- 예외는 상위 클래스의 메서드보다 많이 선언할 수 없다.
| super 키워드
상속 관계를 전제로 상위클래스와 하위클래스의 변수명이 같을 때, super.변수명 으로 부모의 객체의 멤버 값을 참고
* super 안쓰면 자신이 속한 인스턴스 객체의 멤버를 먼저 참조
| super( ) 메서드
상위 클래스의 생성자를 호출
- 생성자 안에서만 사용 가능
- 반드시 첫 줄 입력
- 모든 생성자는 첫줄에 반드시 this( ) 나 super( ) 가 필수!
- 없다면 자동으로 super( ) 생성
- 이때, 상위클래스에 기본 생성자가 없으면 에러!
| 클래스의 정점, Object 클래스
자바의 클래스 상속계층도에서 최상위에 위치한 상위클래스.
자바의 모든 클래스는 Object 클래스로부터 확장된다

아무런 상속을 받지 않는 클래스는 무조건 자동으로 컴파일러가 "extends Object" 자동 추가하여 Object 클래스의 멤버들을 자동으로 상속받아 사용!
<Object 클래스의 대표적인 메서드>
1. toString() : 객체 정보를 문자열로 출력
2. equals(Object obj) : 등가 비교 연산(==)과 동일하게 스택 메모리값을 비교
3. hashCode() : 객체의 위치정보 관련. Hashtable 또는 HashMap에서 동일 객체여부 판단
4. wait() : 현재 스레드 일시정지
5. notify() : 일시정지 중인 스레드 재동작
| 캡슐화 (Encapsulation)
객체의 필드(속성), 메소드를 하나로 묶어 외부에 노출되지 않도록 숨김 처리하는 것
- 데이터 보호 = 정보 은닉(data hiding)
- 내부적으로만 사용되는 데이터에 대한 불필요한 외부 노출을 방지
- 외부로부터 객체의 속성과 기능이 함부로 변경되지 못하게 함
- 데이터가 변경되더라도 다른 객체에 영향을 주지 않기에 독립성을 확보
- 오류의 범위를 최소화로 코드 유지보수에 용이
하기 위해서 사용한다!!
| 패키지 (package)
특정한 목적을 공유하는 클래스와 인터페이스의 묶음, 하나의 디렉토리(directory)
- 패키지가 있는 경우 소스 코드의 첫 번째 줄에 반드시
package 패키지명 표시
- 만약 패키지 선언이 없으면 이름 없는 패키지에 속하게 된다
- 계층 구조 간 구분은 점(.)으로 표현
- 대표적인 패키지 : java.lang , java.util , java.io
- 클래스명 중복으로 인한 충돌을 방지하는 기능
| Import 문
다른 패키지 내의 클래스를 사용하기 위해, 패키지 구문과 클래스 문 사이에 작성
1. import 패키지 명.클래스 명;
2. import 패키지 명.*;
제어자(Modifier)
클래스, 필드, 메서드, 생성자 등에 부가적인 의미를 부여하는 키워드
- 접근 제어자 :
public, protected, (default), private
- 기타 제어자 :
static, final, abstract, native, transient, synchronized 등
| 접근 제어자 (Access Modifier)
클래스, 멤버변수, 메소드, 생성자에 사용되어 외부에서 접근하지 못하도록 제한하는 역할
접근 제어자를 통해 외부로부터 데이터를 보호하고, 불필요하게 데이터가 노출되는 것을 방지
접근 제한 범위 : public(접근 제한 없음) > protected(동일 패키지 + 하위클래스) > default(동일 패키지) > private(동일 클래스)
* 변수명 앞에 아무런 접근 제어자가 없는 경우에는 자동으로 해당 변수의 접근 제어자는 default
| getter 메서드
외부에서 객체의 데이터를 읽을 때 사용
| setter 메서드
외부에서 메서드에 접근하여 조건에 맞을 경우 데이터 값을 변경할 수 있게 해준다
오늘의 회고
오늘은 어제의 개념보다는 아주 조금 이해하기가 더 쉬웠던 것 같다. 확실히 코드를 인텔리제이에 예시로 쫙 적고 한줄한줄 주석 달아가며 해석해서 읽어내려가면서 이해하면 더 와닿는것 같다. 역시 직접 코드로 구현해보고 읽어보는게 최고인가보다!
어제는 이런저런 새로운 용어들도 많았고 그 용어들의 정의도 다 암기? 해야해서 어려웠던 것 같다. 아직 확실히 정리된 느낌은 아니라서 계속 보고 또 보고 익숙해져야 할 것 같다. 또 코드를 차례대로 읽는건 어렵지 않은데, 해당 코드가 런타임에서 메모리에 어떻게 올라오고 빠지는지 그런 그림을 그리는게 어렵다. 시간될 때 런타임 메모리 공부를 보충하고 싶다.
오늘 코스에서 보내주신 웰컴키트가 도착했다! 스티커로 노트 표지를 꾸몄다. 내일 수업에는 코스 티셔츠를 입고 참여해야겠다ㅋㅋ 컵도 내 스타일이다..! 흡족!! 하루종일 집에 박혀 공부하는 입장에서는 이런게 엄청 별거다. 받고 뭔가 뭉클했다. 나의 공부를 응원하고 함께하는 팀이 있다는게 와닿으면서 뭔가 힘이 됐다!
감기도 점점 나아가고 있다. 역시 주사의 힘! 제일 집중이 잘 될 때, 시간 가는 줄 모를 때는 역시 코드치고 코드 읽고 해석하는 시간인 것 같다. 그렇게 공부하는게 기억도 더 잘 되는 것 같아서, 앞으로 되도록이면 직접 한줄한줄 치고 이해하며 공부하려고 한다. 더불어 공책 메모와 함께! 내일도 또 달려보자!! 화이팅!