※ 『super』
static으로 선언되지 않은 메소드에서 사용되며(static은 클래스 로딩 순간 메모리 로딩되는 것)
현재 클래스가 상속받은 상위 클래스의 객체를 가리킨다.
super는 상위 클래스의 생성자를 호출하거나
상위클래스의 멤버 변수 또는 메소드를 호출할 때 사용할 수 있다,
하위클래스의 생성자에서 상위클래스의 생성자를 호출할때에는
★하위클래스의 생성자 정의 구문에서 맨 처음에만 위치할 수 있다,
※ 생성자와 클래스 상속 간의 관계
하위 클래스는 상위 클래스의 멤버를 상속받지만
생성자는 상속 대상에서 제외된다
그리고 , 하위 클래스의 생성자가 호출될 때
자동으로 상위클래스의 생성자가 호출된다.
이 때, 상위 클래스의 생성자는 인수가 없는 생성자 (default 생성자 형태) 가 호출된다.
(상위 클래스 생성자 모양 super();)
상위 클래스 및 하위 클래스를 설계하는 과정에서
생성자를 정의하지(작성하지) 않거나 인수가 없는 생성자만을 정의한(작성한) 경우
명시적으로 하위클래스에서 상위 클래스의 생성자를 호출하지 않아도
아무런 문제가 발행하지 않지만 상위 클래스에 인자가 있는 생성자만 존재하는 경우에는
주의해야 한다,
예를 들어 다음,,,
class A_class
{
A_class(int n)
{
}
}
class B_class extends A-class
{
B_class()
{
// super();
}
}
하위 클래스인 B_class 의 생성자에서 명시적으로 A_class의 생성자를
호출하지 않으면 자동적으로 인자가 없는 생성자를 호출한다.
하지만 A_class에는 인자가 있는 생성자만 존재하고
인자가 없는 생성자는 존재하지 않기 떄문에 에러가 발생한다.
따라서 B_class 생성자 선두에
다음처럼 명시적으로 상위 클래스의 생성자를 호출해야 한다.
class A_class
{
A_class(int n)
{
}
}
clss B_class extends A_class
{
B_class()
{
super(10);
}
}
*/
/*
상위클래스 | 하위클래스 | 결과 |
생성자를 정의하지 않음 |
생성자 정의 안함 인수가 없는 생성자 인수가 있는 생성자 |
→ 가능한 상황 → 가능한 상황 → 가능한 상황 |
인수가 없는 생성자만 정의 |
생성자 정의 안함 인수가 없는 생성자 인수가 있는 생성자 |
→ 가능한 상황 → 가능한 상황 → 가능한 상황 |
인수가 있는 생성자만 정의 |
생성자 정의 안함 인수가 없는 생성자 인수가 있는 생성자 |
→ 에러발생! → 상위클래스의 해당 생성자를 호출하지 않으면 에러 발생 → 상위클래스의 해당 생성자를 호출하지 않으면 에러 발생 |
※ 상속을 진행할 때 주의 사항
상위 클래스에서 선언된 멤버 변수의 이름과 하위클래스에서 선언한 멤버 변수의 이름이 같으면
상위 클래스의 멤버변수는 무시된다. (없어지는 것은 아님, 부모님한테 물려받은 차와 내차, 내차라고 했을 때 내차가 우선시됨)
이 때, 상위클래스의 멤버 변수를 사용하기 위해서는 『super』 키워드를 사용한다.
동일한 이름의 멤버 변수나 동일한 이름의 메소드가
한 클래스 안에 선언되어 있거나 정의되는 경우 기본적으로 에러 발생한다.
단, 메소드의 경우에는 매개변수의 개수나 타입이 다를 때
에러가 발생하지 않고 다른 메소드로 취급하게 된다[Method Overlaoding]
[오버로딩 VS 오버라이딩] (메소드를 구분하느냐 메소드를 재구성해서 활용하느냐)
→ Mothod Overloading 은 메소드의 이름이 같아도 사용할 수 있도록 한 것
메소드의 매개변수의 타입과 개수를 통해서 이름이 같아도 구분이 가능해진다.
→ Method Overriding 은 물려받은 조상클래스의 메소드를 재구성하는 것이다.
단, 추상클래스에서 정의되어있던 접근제어자, 반환자료형, 메소드 이름,매개변수개수타입 등은 동일하도록 유지해야한다.
매개변수가 다르면 오버로딩, 그게 아니고 이름도 같고 매개변수개수타입도 같으면 오버라이딩이다.
class SuperTest107
{
protected double area;
private String title;
public SuperTest107()
{
System.out.println("SuperTest107... 인자없는생성자");
}
public SuperTest107(String title)
{
this.title = title;
System.out.println("SuperTest107... 문자열을 인자로 받는 생성자");
}
public void write()
{
System.out.println(title + "-" + area);
}
}
// SuperTest107을 상속받는 자식클래스
class Rect extends SuperTest107
{
/*
(상위클래스에서 물려받는 부분 복붙)
protected double area;★상속
private String title; //private 이므로 제외!!
public SuperTest107()----------생성자제외!!!!!!!!!!
{
System.out.println("SuperTest107... 인자없는생성자");
}
public SuperTest107(String title)------------생성자 제외!!!!!!!!
{
this.title = title;
System.out.pritnln("SuperTest107... 문자열을 인자로 받는 생성자");
}
public void write()★상속
{
System.out.println(title + "-" + area);
}
*/
Rect()
{
super();
}
private int w, h;
public void calc(int w, int h)
{
this.w = w;
this.h = h;
area = (double)this.w * this.h;
//super.area = (double)this.w * this.h; 같은말
write();
}
//(기능적인 영향은 없지만 이것이 오버라이드 됐다는 것임을 알린다. 이런 기능을 하는 단어를 metadata 라고한다 대표예시 : hashtag#)
@Override // metadata → 어노테이션(Annotation) JDK 1.5 부터시작
public void write()
{
System.out.println("w : " + w +", h : " + h); //this.w this.h this.area super.area 라고 해도 문제가없다.
System.out.println("사각형 → " + area);
}
// ※ 메소드 오버라이딩(Method Overriding)
// 상위 클래스를 상속받은 하위 클래스에서 상위클래스에 정의된 메소드를 재.정.의. 하는 것으로
// 객체지향프로그래밍의 특징인 다형성을 나타낸다.
// 재정의(Overriding)은 반드시 상속 관계가 있어야 하며 메소드 이름, 리턴타입, 매개변수의 갯수나 타입이
// 모두 완전히 일치해야 한다.
// 접근제어자 default - protected - public 은 가능하지만 private은 안된다.
}
class Circle extends SuperTest107
{
/*
(상위클래스에서 물려받는 부분 복붙)
protected double area;★상속
private String title; //private 이므로 제외!!
public SuperTest107()----------생성자제외!!!!!!!!!!
{
System.out.println("SuperTest107... 인자없는생성자");
}
public SuperTest107(String title)------------생성자 제외!!!!!!!!
{
this.title = title;
System.out.pritnln("SuperTest107... 문자열을 인자로 받는 생성자");
}
public void write()★상속
{
System.out.println(title + "-" + area);
}
*/
Circle(String title)
{
super(title);
}
public void calc(int r)
{
area = r*r*3.141592;
write();
}
}
// main() 메소드를 포함하고 있는 외부의 다른 클래스
public class Test107
{
public static void main(String[] args)
{
Rect ob1 = new Rect();
//-==>>SuperTest107... 인자없는생성자
// Circle ob2 = new Circle();
// required: String found: no arguments
// Circle 클래스의 매개변수가 존재하는 사용자정의 생성자로 인해
// default 생성자가 삽입되지 않음.
// → 매개변수가 없는 생성자가 존재하지 않아 발생하게 되는 에러.
Circle ob3 = new Circle("원");
// private String title 탑에갇힌남자 메소드 탑에사는동생 외부클래스 나
// 동생을 통해 쪽지를 전달할 수 있다.
ob1.calc(10,5);
ob3.calc(50);
/*
SuperTest107... 인자없는생성자
SuperTest107... 문자열을 인자로 받는 생성자
w : 10, h : 5
사각형 → 50.0
원-7853.9800000000005
계속하려면 아무 키나 누르십시오 . . .*/
}
}
/*
차를물려받았다
public void write()
{
내용물수정 :
}
차를튜닝하는 것이다. 세단 뚜껑띠고 노란색 라카로 스포츠카로 만들어버리는것
변수의 경우 부모 클래스 double area; doublea area; 둘 다 super 로 구분이 가능하지만
메소드를 재구성해서쓰는게 오버라이딩
위에서보면 write() 메소드를 새로만든게 아니라 덮어쓴 경우가 된다. 메소드 중복정의가 아니라
메소드 재정의이다. write똑같은이름 메소드 : 매개변수가 다르면 오버로딩
그게아니고 이름도 같고 매개변수개수타입도 같으면 오버라이딩이다.
*/
'📚Study Note > JAVA' 카테고리의 다른 글
[ JAVA ] 클래스 고급 - 상속 (Inheritance) ④ (0) | 2021.03.27 |
---|---|
[ JAVA ] 클래스 고급 - 상속 (Inheritance) ③ (0) | 2021.03.27 |
[ JAVA ] 클래스 고급 - 상속 (Inheritance) (0) | 2021.03.27 |
[ JAVA ] 배열과 정렬알고리즘을 활용한, 성적 등수 출력 (0) | 2021.03.27 |
[ JAVA ] 정렬 (Sort) 알고리즘 : "향상된" 버블 정렬 (Bubble Sort) (0) | 2021.03.27 |