📄 학습내용
객체지향 프로그래밍 설계의 핵심
- 상속(inheritance)
- 캡슐화(encapsulation)
- 다형화(polymorphism)
- 추상화(abstraction)
상속
- 상속
- 클래스 재사용해서 새로운 클래스를 작성하는 방법
- 상위 클래스의 멤버(필드, 메서드, 이너 클래스)를 하위 클래스와 공유하는 형태
- 조상-자손 관계, 부모-자식 관계 < 상위 클래스-하위 클래스 관계 (적절한 표현)
- 상속받았다 < 확장되었다 (적절한 표현)
- 클래스 메소드는 클래스에 속한 메소드이기 때문에 상속 불가능
- 장점
- 상위 클래스의 코드 재사용으로 하위 클래스 코드를 작성할 때 간결하게 코드 작성 가능
- 다형적 표현 가능
- extends 키워드 - 상속 구현 키워드
class 하위_클래스 extends 상위_클래스 {}
- 단일 상속만 허용 → 인터페이스를 이용해서 다중 상속 가능
- 포함관계
- 포함 : 다른 클래스의 참조변수를 클래스의 필드에 선언해서 클래스를 재사용하는 방법
- 상속보다 많이 사용하는 방식
- 포함관계과 상속관계 차이
- 포함관계 : "하위_클래스"는 "상위_클래스"를 가지고 있다 (HAS-A) 관계
- 상속관계 : "하위_클래스"는 "상위_클래스"이다 (IS-A) 관계
- 메서드 오버라이딩
- 메서드 오버라이딩 : 하위 클래스에서 상속받은 상위 클래스의 메소드를 재정의하는 것
- 성립 조건
- 하위 클래스의 접근 제어자 범위가 상위 클래스의 접근 제어자의 범위와 같거나 더 넓은 경우
- 메서드 선언부(메서드명, 매개변수, 반환타입) 일치
- 예외는 상위 클래스의 메서드보다 많이 선언 불가능
- 장점 : 오버라이딩할 경우, 하위 클래스의 객체들을 배열로 선언해서 관리 가능 → 편리함
- super과 super() 차이점
- super
- 상위 클래스의 객체 자신
- 상위 클래스와 하위 클래스에 같은 이름의 변수를 구분하기 위해서 사용
- 하위 클래스에서 super 키워드를 사용하지 않는 경우에는 자바 컴파일러는 자신이 속한 인스턴스 변수를 먼저 참조
- super() 메소드
- 상위 클래스의 생성자 호출
- this() 메소드와 동일하게 생성자 안에서 첫 번째 줄에 선언해야 함
- super
// super 예제코드
public class Test {
public static void main(String[] args) {
Sub s = new Sub();
s.print("Local");
}
}
class Super { // 상위 클래스
String str = "Super"; // super.str
}
class Sub extends Super { // 하위 클래스
String str = "Sub"; // this.str
void print(String str) { // str
System.out.println(str); // 지역 변수
System.out.println(this.str); // 멤버 변수
System.out.println(super.str); // 상위 클래스의 멤버 변수
}
}
// 출력결과
Local
Sub
Super
- Object 클래스
- 최상위에 위치한 상위 클래스
- 아무것도 상속받지 않은 클래스는 컴파일링할 때 자동으로 Object 클래스가 상속됨
- 최상위 클래스 Object의 멤버들을 자동으로 상속받아서 사용 가능
- Object 클래스 메서드
- toString()
- equals(Object obj)
- hashCode()
- wait()
- notify()
캡슐화
- 캡슐화 : 객체의 속성과 기능을 데이터를 외부로부터 보호하기 위해서 하나의 캡슐로 감싸는 것
- 목적
- 데이터 보호
- 정보 은닉(data hiding)
- 불필요한 데이터 외부 노출 방지해서 외부부터 객체의 속성과 기능 함부로 변경하는 것을 막기
- 데이터 변경시 다른 객체에 영향을 주지 않는 독립성 확보
- 캡슐화 수행 수단
- 접근제어자 : 데이터 보호 & 불필요한 데이터 노출 방지(정보 은닉)
- getter() & setter() 메서드 : 데이터를 효과적으로 보호 & 의도적인 데이터 변경 가능
- 자바 패키지(java package)
- 패키지 : 비슷한 클래스와 인터페이스의 묶음
- 목적
- 효율적인 관리 : 그룹 단위로 클래스와 인터페이스를 묶어서 효율적인 관리 가능
- 클래스 출동 방지 : 같은 이름의 클래스라도 다른 패키지에 소속되면 충돌 발생 X
- 점(.) : 계층 구분하기 위해서 사용
- 반드시 코드의 첫번째 줄에서 선언, 패키지 선언이 없으면 이름 없는 패키지에 소속됨
- import문
- 다른 패키지에 선언된 클래스 사용 가능
- 컴파일 때 처리되어서 프로그램 성능에 영향을 주지 않음
- 제어자
- 기타제어자 : static, final, abstact, native, transient, synchronized ...
- 접근제어자 : public, (default), protected, private
- 접근 제어자
- default : 접근제어자를 설정하지 않은 경우 자동으로 할당되는 것
- getter() & setter() 메서드
- getter() 메서드
- 멤버 변수의 값을 반환하는 메서드
- get~을 붙인 메서드를 생성해서 사용
- 필요에 따라서 데이터를 가공해서 반환
- setter() 메서드
- 멤버 변수의 값을 변경하는 메서드
- set~을 붙인 메서드를 생성해서 사용
- getter() 메서드
[Optional 심화 실습] 전기 요금 계산기
https://github.com/kung036/be-sprint-electricitybill
[Optional 심화 실습] 구구단 프로그램
https://github.com/kung036/be-sprint-gugudan
🧶 발생한 문제 및 해결방법
- 문제점) 자바의 System.out.printf()를 이용해서 double형 출력 시 오류 발생
- 해결방법) C, C++에서는 double형을 출력하려면 지시자가 %lf였지만, 자바에서는 소수점 형식을 출력하려면 %f를 이용해서 출력
- 문제점) git push origin main을 했을 때 * error: failed to push some refs to '깃주소' 에러 발생
- 해결이유) local repository와 remote repository 상태가 달라서 에러 발생
- 해결방법) git pull
⭐ 공부 난이도
상속 & 캡슐화 ☆☆☆☆★
오버라이딩의 성립조건 중 세번째가 이해가 되는가? 예외는 왜 나오는가?
→ 예외 : try catch 구문
🌕 느낀점
오늘은 공부를 하고 시간이 넉넉히 남아서 저번에 못했던 Java Optional 심화 실습을 하였다. 상속과 캡슐화를 공부를 다하고 지금 생각해보니 정말 내가 잘 알고 사용할 수 있을까라는 의문이 들었다. 항상 코딩을 할 때 생각없이 하는 것같은데 이번에 코딩을 하면 상속과 캡슐을 신경써서 해야겠다.
'코드스테이츠 - 3회차 백엔드 부트캠프 > Section 1' 카테고리의 다른 글
2022.09.08 목 - 프로그램 작성 (0) | 2022.09.08 |
---|---|
2022.09.07 수 - 다형성, 추상화 (0) | 2022.09.07 |
2022.09.05 월 - 생성자와 내부 클래스 (0) | 2022.09.05 |
2022.09.02 금 - 클래스와 객체 (0) | 2022.09.02 |
2022.09.01 목 - 배열 (0) | 2022.09.01 |