D+30-접근제한자.종류,getsetter,상속.방법,메모리구조,super,오버라이딩,

Bku·2024년 2월 6일

학원 일기

목록 보기
27/67
post-thumbnail

접근제한자

접근제한자

접근제한자의 종류

접근제한자 : 각 속성(필드)/함수(메소드)를 사용허가를 하는 예약어

  1. public : 모든 클래스는 사용가능
  2. private: 모든 클래스 사용불가 (오직 자신의 클래스만 사용)
  3. default: 생략가능, 자신의 폴더(패키지)에서만 사용가능
    4.protected: 상속관계에서 사용

접근제한자 생략

자바에서 접근 제한자가 없는 함수는 기본적으로 "패키지 프라이빗(package-private)"으로 취급됩니다. 같은 패키지 내의 다른 클래스에서는 이 함수에 접근할 수 있지만, 다른 패키지에 있는 클래스에서는 접근할 수 없습니다.

패키지 프라이빗 함수는 다음과 같이 선언됩니다:

Copy code
void functionName() {
    // 함수의 내용
}

함수 선언 앞에 접근 제한자를 명시하지 않으면 자동으로 패키지 프라이빗으로 간주됩니다. 이는 클래스나 인터페이스의 멤버 함수에만 적용되며, 전역 함수나 메서드에는 해당하지 않습니다.

캡슐화와 getter, setter

캡슐화를 위해 속성은 private로 하여 사용자로부터 접근을 제한하고 함수를 이용해서만 접근할 수 있도록 함수는 public으로 해주면된다.

이 때 private변수에 접근하게 해주는 함수들이 getter와 setter이다.

상속

상속

상속을 하면 부모클래스와 자식 클래스가 있어야한다. 자식클래스가 부모클래스를 상속하면 부모의 함수와 속성들을 사용할 수 있다.

속성 사용


CellPhone이라는 부모클래스를 만들었고, DmbCellPhone이라는 자식 클래스를 만들었다.
둘은 상속 관계이다.
마지막으로 main클래스인 CellPhoneApplication을 만들었다.

부모 클래스

public class CellPhone {
    protected String model;
    protected String color;}

부모 클래스에 위 두개의 속성만을 만들었다.

자식 클래스

public class DmbCellPhone extends CellPhone{
    int channel; // tv 채널 속성}

자식 클래스에 한개의 속성을 만들었다.

main 클래스

자식 클래스에 없던 속성도 자식 인스턴스 호출로 사용할 수 있게 된다.

함수 사용

함수도 마찬가지로 부모의 함수를 자식이 사용할 수 있다.
부모 클래스

public class CellPhone {
    protected String model;
    protected String color;

    public void setModel(String model) {
        this.model = model;
    }

    public String getModel() {
        return model;
    }

    void powerOn(){
        System.out.println("전원 켜기");
    }

    void powerOff(){ // 접근제한자를 설정하지 않으면 "패키지 프라이빗(package-private)"으로 취급해서
        //같은 패키지 내의 다른 클래스에서는 이 함수에 접근할 수 있지만, 다른 패키지에 있는 클래스에서는 접근할 수 없다.
        System.out.println("전원 끄기");
    }

    void bell(){
        System.out.println("벨이 울립니다.");
    }

    void voice(){
        System.out.println("통화를 합니다.");
    }

    void hangUp(){
        System.out.println("전화를 끊습니다.");
    }
}

부모 클래스에 다음과 같은 함수를 만들었다.

main 클래스

컴파일 오류없이 자식이 부모의 함수를 사용할 수 있다.

상속의 메모리구조

자식 인스턴스를 생성하면 그 참조값은 자식과 부모 두개의 클래스를 가르킨다. 그리고 함수를 호출하면 먼저 자식 클래스에서 찾다가 없으면 부모클래스로 올라가서 찾고 있으면 성공적으로 가져온다.

상속을 쓰는 이유

상속을 사용하면 비슷한 성질을 사용하는 클래스가 새로운 함수와 속성을 정의 할 필요없이 부모의 것을 사용할 수 있으므로 효율을 증가시킬 수 있다.

물론 하나의 클래스만 있다면 다시 한두번 속성과 함수를 작성해주면 되지만 여러개의 비슷한 클래스들이 추가 된다면 예사 일이 아니게 된다. 이 때 상속을 사용해주면 된다.

super예약어

상속에서 생성자

자식 부모클래스를 상속했을때 부모가 생성자가 있다면 자식도 이 생성자를 반드시 만들어야한다.왜냐하면 자식클래스가 부모의 속성을 이용해야하는데 생성자로 값이들어오지 않으면 오류가 발생할 수도 있기 때문이다.

이때 자식클래스에서 생성자를 만들면 부모의 요소들은 super를 붙여서 나타내게 된다.

부모 클래스

public class People {
    public String name;
    public String ssn;
    
// 생성자
    public People(String name, String ssn) {
        this.name = name;
        this.ssn = ssn;
    }
}

자식 클래스

public class Student extends People{
    public int studentNo;
    
    //생성자
    public Student(String name, String ssn, int studentNo) {
        super(name, ssn);
        this.studentNo = studentNo;
    }
}

참고로 자식은 생성자에서 매개변수를 추가할 수 있다.

생성자 호출 순서

생성자에서는 순서가 중요하다. 부모의 생성자가 먼저 호출되지 않으면 컴파일 에러가 발생한다. 왜냐하면 부모 클래스의 생성자가 자식 클래스의 생성자보다 먼저 호출되어야 부모 클래스의 초기화가 먼저 이루어지고, 이후에 자식 클래스의 초기화가 이루어져야 하기 때문이다.

super보다 다른 생성자를 먼저 호출하니 컴파일 에러가 발생했다.

오버라이딩

오버라이딩

부모의 함수를 자식이 상속했을때 자식이 필요한 기능이 더 있을 수도 있다. 이때 오버라이딩을 통해 부모의 함수를 자식이 재 정의해서 사용할 수 있다.

부모 클래스

public class Calculator {
    public double areaCircle(double r){
        System.out.println("부모함수");
        return r * r * 3.14;
    }
}

부모클래스에 메서드를 하나 만들었다.
자식 클래스

public class Computer extends Calculator{
    @Override
    public double areaCircle(double r) {
        System.out.println("자식 함수");
        return r * r * Math.PI;// 참고로 파이는 전역상수
    }
}

이름이 같은 함수를 자식 클래스에도 만들었다.하지만 내용은 다르다 즉 오버라이딩한것이다.

main 클래스

public class ComputerApplication {
    public static void main(String[] args) {
        Calculator calculator = new Calculator();
        System.out.println(calculator.areaCircle(10));

        Computer computer =new Computer();
        System.out.println(computer.areaCircle(10));

    }
}

실행시켜보자

결과

자식은 자식의 함수를, 부모는 부모의 함수를 호출하는 것을 알 수있다.

오버라이딩 메모리구조

자식인스턴스에서 호출하였으니자식의 클래스에서 해당이름이 있는 메서드를 먼저 찾고 없으면 부모로 가게 된다. 이 때 자신의 클래스에 오버라이딩 한 함수가 있다면 자신의 것을 호출하게 되는 것이다.

어노테이션

 @Override

자바에서 이렇게 골뱅이를 붙여 표현한 것을 어노테이션이라고 한다. 함수와 비슷한 것으로 간단한 기능을 제공한다. 함수나 클래스에 붙이는 것이 가능하다.

override는 오버라이딩함수를 의미하고 오타등을 알려주는 기능을 한다.

이건 스프링에서 많이 사용하는 기능이므로 그때 자세하게 다루자.

profile
기억보단 기록

0개의 댓글