코드스테이츠 - 3회차 백엔드 부트캠프/Section 1

2022.09.06 화 - 상속, 캡슐화

곰돌이볼 2022. 9. 6. 08:57

📄 학습내용

객체지향 프로그래밍 설계의 핵심

  • 상속(inheritance)
  • 캡슐화(encapsulation)
  • 다형화(polymorphism)
  • 추상화(abstraction)

 

상속

  • 상속
    • 클래스 재사용해서 새로운 클래스를 작성하는 방법
    • 상위 클래스의 멤버(필드, 메서드, 이너 클래스)를 하위 클래스와 공유하는 형태
  • 조상-자손 관계, 부모-자식 관계 < 상위 클래스-하위 클래스 관계 (적절한 표현)
  • 상속받았다 < 확장되었다 (적절한 표현)
  • 클래스 메소드는 클래스에 속한 메소드이기 때문에 상속 불가능
  • 장점
    • 상위 클래스의 코드 재사용으로 하위 클래스 코드를 작성할 때 간결하게 코드 작성 가능
    • 다형적 표현 가능
  • extends 키워드 - 상속 구현 키워드
class 하위_클래스 extends 상위_클래스 {}
  • 단일 상속만 허용 → 인터페이스를 이용해서 다중 상속 가능
  • 포함관계
    • 포함 : 다른 클래스의 참조변수를 클래스의 필드에 선언해서 클래스를 재사용하는 방법
    • 상속보다 많이 사용하는 방식
    • 포함관계과 상속관계 차이
      • 포함관계 : "하위_클래스"는 "상위_클래스"를 가지고 있다 (HAS-A) 관계
      • 상속관계 : "하위_클래스"는 "상위_클래스"이다 (IS-A) 관계
  • 메서드 오버라이딩
    • 메서드 오버라이딩 : 하위 클래스에서 상속받은 상위 클래스의 메소드를 재정의하는 것
    • 성립 조건
      1. 하위 클래스의 접근 제어자 범위가 상위 클래스의 접근 제어자의 범위와 같거나 더 넓은 경우
      2. 메서드 선언부(메서드명, 매개변수, 반환타입) 일치
      3. 예외는 상위 클래스의 메서드보다 많이 선언 불가능
    • 장점 : 오버라이딩할 경우, 하위 클래스의 객체들을 배열로 선언해서 관리 가능 → 편리함 
  • super과 super() 차이점
    • super
      • 상위 클래스의 객체 자신
      • 상위 클래스와 하위 클래스에 같은 이름의 변수를 구분하기 위해서 사용
      • 하위 클래스에서 super 키워드를 사용하지 않는 경우에는 자바 컴파일러는 자신이 속한 인스턴스 변수를 먼저 참조
    • super() 메소드
      • 상위 클래스의 생성자 호출
      • this() 메소드와 동일하게 생성자 안에서 첫 번째 줄에 선언해야 함
// 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~을 붙인 메서드를 생성해서 사용

 

[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 심화 실습을 하였다. 상속과 캡슐화를 공부를 다하고 지금 생각해보니 정말 내가 잘 알고 사용할 수 있을까라는 의문이 들었다. 항상 코딩을 할 때 생각없이 하는 것같은데 이번에 코딩을 하면 상속과 캡슐을 신경써서 해야겠다.