풀스택 자바 - 20240806

김진아·2024년 8월 6일

상속과 생성자


상속받은 자식 클래스와 부모 클래스가 있을 때, 자식 클래스의 생성자 함수가 실행되면 부모의 생성자 함수도 실행된다.

public class Main {
    public static void main(String[] args) {
		자식 자식 = new 자식();  
        // 출력: "부모입니다." 
        //       "자식입니다."
	}
}

class 부모 {
	부모() {
    	System.out.println("부모입니다.");
    }
}
class 자식 extends 부모 {
	자식() {
    	System.out.println("자식입니다.");
    }
}

super 메소드

  • 자식 클래스에서 부모 클래스의 멤버(필드, 메소드)를 참조할 때 사용
  • 메소드 내부에서만 사용 가능
public class Main {
    public static void main(String[] args) {
		자식 자식 = new 자식();  
        // 출력: "부모입니다." 
        //       "자식입니다."
	}
}

class 부모 {
	String 이름;
	부모() {
		이름 = "부모님";
	}
}
class 자식 extends 부모 {
	자식() {
    	System.out.println(
    }
}



인터페이스


  • 인터페이스(interface)는 서로 다른 두 개의 시스템, 장치 사이에서 정보나 신호를 주고받는 경우의 접점이나 경계면
  • 일종의 매개체이자 '소통하기 위한 접점'

사용자의 인터페이스

  • 사용자가 기기를 쉽게 동작시키는 데 도움을 주는 시스템
  • UI(User Interface)

개발자의 인터페이스

  • 통신과 상호작용을 위해 정해둔 약속[명세, 규약, 정해진 틀]의 개념



자바의 인터페이스


  • 클래스가 구현해야 하는 메소드의 집합을 정의
  • 인터페이스를 사용하면 여러 클래스가 공통된 메소드를 가지게 할 수 있다.
  • 구현을 강제할 수 있다.

예시

public class Main {
    public static void main(String[] args) {
        Cat c = new Cat();
        Dog d = new Dog();

        c.cry();		// 출력: "냐옹"
        c.play();       // 출력: "낚시 장난감을 가지고 놉니다."
        d.cry();		// 출력: "멍멍"
        d.play();		// 출력: "공을 가지고 놉니다."
    }
}

interface Animal {
    void cry();
}
interface Pet {
    void play();
}
class Cat implements Animal, Pet {
    public void cry() {
        System.out.println("냐옹");
    }
    public void play() {
        System.out.println("낚시 장난감을 가지고 놉니다.");
    }
}
class Dog implements Animal, Pet {
    public void cry() {
        System.out.println("멍멍");
    }
    public void play() {
        System.out.println("공을 가지고 놉니다.");
    }
}

추상 클래스와의 차이점

인터페이스

  • 다중 상속 가능
  • 메소드(공통적인 동작)만을 강제함
  • 상수 필드만을 가질 수 있음. => 'public static final'
  • 메소드는 기본적으로 'public'이어야 함. 'abstract'는 생략 되어있음

추상 클래스

  • 여러 클래스가 공통적으로 가져야 하는 메소드와 필드를 정의
  • 구상(일반) 클래스와 인터페이스 사이의 중간 성질



접근제한자


'puclic', 'protected', 'private' 총 세가지가 있다.

public

  • 클래스 외부의 어떤 코드든 접근 가능하다.
  • 클래그, 필드, 메소드, 생성자 모두에게 적용 가능
public class MyClass {
    public int publicField; // 다른 클래스에서 접근 가능

    public void publicMethod() {
        // 다른 클래스에서 호출 가능
    }
}

protected

  • 같은 패키지인 경우 접근 허용
  • 다른 패키지라도 상속을 받은 경우 접근 허용
  • 클래그, 필드, 메소드, 생성자 모두에게 적용 가능
public class MyClass {
	   protected int protectedField; // 같은 패키지와 자식 클래스에서 접근 가능

    protected void protectedMethod() {
        // 같은 패키지와 자식 클래스에서 호출 가능
    }
}

private

  • 해당 클래스 내부에서만 접근 가능
  • 클래스, 필드, 메소드에 적용가능. 생성자에는 적용되지 않는다.
public class Main {
    public static void main(String[] args) {
        사람 a사람 = new 사람();
        //쉽고 무분별한 접근을 막을 수 있고 들어오는 데이터를 검증할 수 있다. 
        //a사람.나이 = 20   //오류
        a사람.set나이(20);
        System.out.println("나이는 "+a사람.get나이());
    }
}

class 사람 {
    private int 나이;

    void set나이(int 나이) {
        this.나이 = 나이;
    }
    int get나이() {
        return this.나이;
    }
}

접근 제한자가 없을 때 (default)

  • 같은 패키지인 경우만 접근 가능
profile
https://develop-chick.tistory.com/ 첫번째 블로그

0개의 댓글