15일차에서 조금 정리했지만 16일차에서 본격적으로 정리하는
※super() - 부모 클래스의 생성자를 호출하는 super()
★★★★★
부모 생성자가 매개변수를 가지고 있다면 자식은 부모의 생성자에게 매개변수를 넣어줘야 함
- 자식클래스에서 부모클래스의 매개변수를 받아오기위해 사용.
- 모든 클래스의 생성자 첫 줄에는 생성자를 호출해야한다
- 그렇지 않으면 컴파일러가 자동적으로 super() 를 생성자의 첫줄에 넣어준다
Point(int x, int y){
this.x=x;
this.y=y;
}
△ 매개변수와 this 사이에 컴파일러에 의해 자동생성된 super()가 생략 되어있다
super(); => 컴파일러가 자동적으로 삽입. 조상인 object 클래스의 생성자( Object() )를 호출
▷ 차이점알기
this () : 같은 클래스의 다른 생성자를 호출하는 데 사용
super () : 부모 클래스의 생성자를 호출하는데 사용됨
▶ ★자식클래스에서 super () 사용순서
1. 부모생성자 매개변수 받아오기
Student(String name, int age)
2. 자식(본인)클래스에서 추가된 매개변수를 생성자에 추가하기
Student(String name, int age, String major)
3. super , this 이용해 부모 매개변수 받아오고,
본인 매개변수 넣어주기
Student(String name, int age, String major){
super(name,age);
this.major=major;
▽완성본 한눈에 보기
class Person{
protected String name;
protected int age;
Person(String name, int age){
this.name = name;
this.age = age;
}
}
class Student extends Person{
private String major;
Student(String name, int age, String major){
super(name,age);
this.major=major;
}
Also
▷자식 클래스에 매개변수가 없더라도 부모클래스의 매개변수를 받는 생성자를 만들어줘야한다
=> 자식 클래스에 매개변수가 없더라도 반드시 생성자를 만들어줘야함
class Father{
protected String name;
Father(String name){
this.name = name;
}
}
class Son extends Father{
Son(String name){
super(name);
}
}
=> 자식클래스인 son 에는 매개변수가 없지만 부모클래스인 Father 의 매개변수 name을 받기위해
super 를 이용하여 생성자를 만들어 줌
만약 ! ▽ 아래처럼
자식클래스 생성자에서 super로 부모의 매개변수를 받아오지 않는다면 ?
( like 상속관계가 아닌 클래스의 생성자를 만들듯이)
class Father{
protected String name;
Father(String name){
this.name = name;
}
}
class Son extends Father{
private int age;
Son(int age);
this.age = age;
}
}
error ) Implicit super constructor Point() is undefined. Must explicitly invoke another constructor
자식클래스 생성자 수정 :
Son (String name, int age){
this.age = age;
super(name);
}
==> Good ~
※final
- 마지막의, 변경될 수 없는
- final 을 사용하면 제한이 생긴다 ( ~할 수 없다 )
- 클래스, 메서드, 멤버변수, 지역변수 에서 사용할 수 있다
[1] final 변수 :
- 값을 변경할 수 없는 상수
ㄴ 상수 : 한번 초기화되면 더 이상 값을 변경할 수 없는 멤버
- 멤버변수, 지역변수에 모두 사용가능
- The final field MyFinal.PI cannot be assigned
1-1 ) fianl 변수 :
- 각 인스턴스마다 다른값을 갖도록 할 수 있다
- 상수지만 선언과 함께 초기화하지않고 생성자에서 단 한번만 초기화 가능
final String KIND;
final int NUMBER;
Card(String k, int num){
KIND = k;
NUMBER =num;
}
1-2 ) static final 변수 :
- 클래스 차원에서 하나만 생성되고, 모든 인스턴스가 같은 값을 갖는다 (공유)
- 선언과 함께 초기화
static final int WIDTH = 100;
[2] final 메서드 :
- 오버라이딩을 할 수 없게 됨
- error : Cannot override the final method from Parent2
[3] final 클래스 :
- 자식클래스를 정의하지 못하게 됨
- error : The type Child cannot subclass the final class Parent
※포함관계 (Has a)
- 상속관계 (Is a) 와 유사하니 주의.
▶그렇다면 포함관계와 상속관계는 각각 언제 사용하나요 ?
상속관계 : is a 관계가 성립하면 상속을 이용한다
~ is a => ~ 는 일종의 ~ 이다
ex ) SportsCar is a Car
포함관계 : has a 관계가 성립하면 포함관계를 이용한다
~ has a = > ~는 ~를 가지고 있다
ex ) Circle has a Point
▶ 포함관계 사용해보기
1. 포함시킬 class 생성
class Points2{
int x;
int y;
Points2(int x,int y){
this.x = x;
this.y = y;
}
}
- 포함관계 멤버변수 제한자 protected 일 필요 없음
2. 재사용하려는 클래스를 멤버변수로 포함시킨다
class Circle2{
private Points2 p; // 위의 class 를 매개변수로 가져옴
private int r;
3. 재사용하려는 클래스를 생성자 매개변수에 넣는다
class point {
int x;
}
class Circle{
private Points p;
Circle(int r, Points p){
this.p=p;
}
}
- 클래스를 매개변수로 넣는 것 어려울것 없음 ~!
모르겠으면
1. int 로 우선 써보고
2. int 를 클래스명으로 변경한다
4. 사용할때는 참조변수 . 으로 사용
//재사용할 class
class point {
int x;
}
// 새 class
class Circle{
private Points p;
Circle(int r, Points p){ // (클래스명 + 참조변수) 로 클래스를 매개변수에 넣기
this.p=p;
}
public void showInfo() {
System.out.println("x="+ p.x); //참조변수 .
}
5-1. main 에서
클래스를 매개변수로 객체생성
직접넣기
Circle c = new Circle(new Points(10,20));
c.printInfo();
5-2. main 에서
클래스를 매개변수로 객체생성
변수지정해서 넣기
int n =7;
Points p = new Points(30,40);
Circle c1 = new Circle(n,p);
c2.printInfo();
※ classpath
와이거진짜모르겠는데 일단 필기함
환경변수 path : 확장자가 exe 인 실행화일을 찾는경로
환경변수 classpath : 확장자가 class 인 클래스화일을 찾는 경로
자바 가상머신이 클래스를 찾을 때, 이 클래스 패스를(class path) 기준으로 찾게 됨
'JAVA' 카테고리의 다른 글
[JAVA] 다형성 / 클래스가 매개변수 or 반환타입 인경우 + 다형성 (0) | 2022.03.02 |
---|---|
<Eclipse 이클립스 단축키> (0) | 2022.03.01 |
[JAVA] 상속 / 오버라이딩 / this,super / 검색하기 (0) | 2022.02.26 |
[JAVA] 클래스배열 (0) | 2022.02.24 |
[JAVA] Static (0) | 2022.02.23 |