java 학습일기 day8 - super와 super()

이건구·2023년 9월 7일
0

java학습일기

목록 보기
7/13

1. super란

2. super()란

1. super란

상속을할때 부모클래스와 자식클래스에 같은 이름의 변수가 존재한다면 자식클래스의 메서드에서 부모클래스에 존재하는 같은이름의 변수에 접근할 방법이 없다.

이럴때 super를 사용한다면 접근이가능한데 아래의 코드로 이해해보면 편하다.

public class SuperExam1 {
    public static void main(String[] args) {
        Child c1 = new Child();
    }
}

class Parent {
    String name = "홍길동";
}

class Child extends Parent {
    String name = "홍꺽정";
    void 자기소개() {
        System.out.printf("안녕하세요 저는 %s의 아들 %s입니다.", super.name, name);
    }
}

원래라면 name이라는 변수가 겹쳐서 Parent클래스에있는 "홍길동"이라는 정보를 사용할수 없는데

super.변수명 을 사용하여 메서드를 만들고 메인함수에서 c1객체의 자기소개() 메서드를 시용하면 "안녕하세요 저는 홍길동의 아들 홍꺽정입니다."가 출력된다.

2. super()란

super와 비슷하게 부모클래스에서 가져오는것인다 super()는 부모클래스의 생성자를 가져오는것이다.

자바는 기본적으로 아무것도없는 생성자는 생략해주지만 원래는 있는것이다.

public class SuperExam1 {
    public static void main(String[] args) {
    }
}

class Parent {
}

class Child extends Parent {
}

위 코드의 Parent클래스와 Child클래스에는 아무것도 안보이겠지만 사실은

public class SuperExam1 {
    public static void main(String[] args) {
    }
}

class Parent {
	Parent() {
    }
}

class Child extends Parent {
	Child() {
    	Parent() {
        }
    }
}

이렇게 되어있다. 여기서 Parent() = super()이다.

이를 확인하려면 아래코드를 보면 알수있다.

public class SuperExam2 {
    public static void main(String[] args) {
        Child c1 = new Child();
    }
}

class Parent {
    Parent() {
        System.out.println("안녕하세요P1");
    }
}

class Child extends Parent {
    Child() {
        System.out.println("안녕하세요C1");
    }
}

new Child();를 하게되면 먼저 "안녕하세요P1"이 출력되고 "안녕하세요P2"가 실행이된다.

원래라면 부모생성자를 만들어준다면 자식의 생성자에도 추가를 해야한다. 근데 매개변수가 없는 생성자는 자동으로 해준다.

그럼 super()는 언제 쓰냐면 매개변수가있는 생성자를 호출할때 사용한다.

매개변수가있는 생성자는 자바가 자동으로 만들어주지 않기때문에 수동으로 만들어줘야한다.

public class SuperExam2 {
    public static void main(String[] args) {
        Child c1 = new Child("홍꺽정", 15);
    }
}

class Parent {
    String name;
    int age;
    Parent(String name1, int age1) {
        this.age = age1;
        this.name = name1;
        System.out.printf("안녕하세요 %d살 %s입니다", age, this.name);
    }
}

class Child extends Parent {
    String name2;
    int age2;
    Child(String name3, int age3) {
        super(name3, age3);
    }
}

Parent 클래스에 매개변수로 받은 이름과 나이를 출력하는 생성자를 만들어놓고 Child 클래스에도 생성자를 만드는데 이때 생성자를 생성할때는 Parent 클래스의 생성자와 매개변수의 갯수를 맞춰야한다.

그렇지않으려면 Parent 클래스안에 Child 클래스에서 만드는 생성자의 매개변수와 갯수가 같은 생성자를 하나 또 만들어야한다.

위 코드를 실행하면 Child 클래스의 생성자에는 출력문구가 없는데도 메인함수에서 Child객체를 만들면 "안녕하세요 15살 홍꺽정입니다"가 출력이 된다.

0개의 댓글