Cohe

08 상속, modify 본문

개발 언어/JAVA

08 상속, modify

코헤0121 2024. 3. 14. 17:53
728x90
  • 상속
    • 상속은 기존의 클래스를 확장하여 새로운 클래스를 이끌어 내는 것을 의미
    • 기존의 코드를 재사용함 → 필요 코드 제작성을 줄여줌
    • 자바에서는 단일 상속만 가능
    • 상속은 하나의 부모 클래스만 가질 수 있음 → 단 인터페이스는 다중상속이 가능!
    • extends
    • 부모 클래스(super)의 멤버(변수와 메소드)를 자식 클래스(sub)에서 사용이 가능함
    • 생성자는 상속이 안된다.
    • sub class is-a Super class
  • has a 관계 : 객체가 멤버를 가지고 있다
    • 일 경우 NameCart has a name
  • class NameCart{ String name; int size; }
  • 상속에서 알아야 할 점~
    • 최상위 클래스는 Object 클래스이다
  • final 클래스는 상속 불가
  • abstract 클래스는 추상클래스이며 반드시 상속해서 사용해야 한다.

상속의 Bad Case, Good Case

  • Bad Case → 개별 클래스들이 중복된 속성/기능을 포함하는 경우
  • Good Case → 중복된 기능을 빼고, 새로운 클래스로 작성한 후 구체화 시킨 경우
    • 일반화 된 클래스는 부모 클래스
    • 구체화된 클래스는 자식 클래스
  • 오버라이딩 : 부모 클래스로부터 상속받은 메서드를 자식 클래스에서 행위를 바꾸거나 보완하기위해서 재정의 해 사용하는 것을 말함
    • 재정의의 규칙
      • 상속을 전제로 한다
      • return 타입, 메서드 이름, 파라미터 변수 선언이 일치해야 한다.
      • 접근제한자는 같거나 more pubblic 해야 한다
        • private <defalt<protected<public
    • 최상위 객체
    • hashCode(); 객체 동등 비교를 위해 : 본인 자신인지 판단
    • equals : 비교를 위해 재정의
    • toString
      • 기본적으로 클래스명@hashcode 값으로 출력
      • 재정의 해서 객체 내의 정보를 확인하는 용도로 사용됩니다Object Class

this와 super

  • this는 현재 객체(자기 자신)
    • 변수 또는 메서드를 참조
    • this.name => 자기 자신의 name 멤버변수를 참조
    • this.go() => 자기 자신의 go() 메서드를 참조하겠다...
    • 자기 자신 클래스 내의 다른 생성자를 참조
    • this(); => 기본 생성자를 참조
    • this("hello"); => 자신이 가지고 있는 생성자를 호출. 인자 값을 처리하는 생성자
  • super
    • 부모의 변수 또는 메서드를 참조
    • super.name => 부모의 name 멤버변수를 참조
    • super.go() => 부모의 go() 메서드를 참조
    • 부모 생성자를 참조
      • super() => 부모의 기본 생성자를 참조
    • super(10, 20) => 부모의 해당 인자값을 처리하는 생성자를 참조
      • super("hello")
    • super는 현재 객체의 부모 객체, 한단계 위 부모를 의미함.

  • 접근 제한자는 클래스와 클래스 변수 메서드 생성자 등의 접근을 제어할 수 있는 제한자
    • 클래스의 경우에는 public과 default만 가능함
    • 단 내부 클래스 4가지 접근제한자 모두 가능
      • 내부 클래스란 클래스 내부에 정의된 클래스
Modifier same Class same Package package& subclass Other package(전체)
public 0 0 0 0
protected 0 0 0 x
default 0 0 x x
private 0 x x x

캡슐화(은닉)

  • 접근 제한자를 이용하여 접근 제한하는 경우로 외부에서 변수에 직접 접근 X
      • 직접 접근 안되니 메서드를 통해서 변수의 값을 변경 및 참조
    • 왜? 이런 방식을 사용할까?
      • 잘못된 값(데이터)이 변수의 값이 되는 것을 방지하기 위해서...
      • 접근 권한이 없는 사용자에 의한 데이터 접근을 방지하기 위해서...
    • 어떻게?
      • 변수 선언 앞에 private
      • 메서드 선언 앞에는 public (getter/setter)
      • 기억할 것은 변수만 아니라 클래스 안에서만 사용하는 메서드들에 대해서도 private 설정 가능하고 이를 외부에서 사용할 때도 동일한 방식을 사용할 수 있음.
public class C05\_encapsulation {
public static void main(String[] args) {
    // badcase
    MyDate_badCase myBirth = new MyDate_badCase();
    myBirth.day = 32;
    System.out.println("My birth day is "+myBirth.day);

    // goodcase
    MyDate_goodCase myBirMyDate_goodCase = new MyDate_goodCase();


// myBirMyDate\_goodCase.day = 32; //접근 제한자 private으로  
myBirMyDate\_goodCase.setDay(32);  
System.out.println("My birth day is "+myBirMyDate\_goodCase.getDay());  
}  
}

// badcase  
class MyDate\_badCase {  
public int day;  
public int month;  
public int year;  
}

// goodcase  
class MyDate\_goodCase {  
private int day;  
private int month;  
private int year;


//getter
public int getDay() {
    return day;
}

//setter : 입력값 검증
public void setDay(int day) {
    if((day < 1) || (day > 31)) {
        System.out.println("잘못된 날짜 입력입니다.");
        this.day = 1;
    }else {
        this.day = day;
    }
}
}

'개발 언어 > JAVA' 카테고리의 다른 글

10 Interface 인터페이스  (1) 2024.03.18
09 Usage Modifier  (0) 2024.03.15
07 Class, Method, Package  (0) 2024.03.13
회원관리 시스템 작성  (0) 2024.03.12
06 class  (0) 2024.03.12