class Student{
private String name;
int age; //18보다 큰 나이만 허용 가능
}
Student st = new Student();
st.age = 2; //오류는 아니지만 시나리오 입장에서 오류
모호한 데이터가 수정되거나 조회되지 않도록
개발자가 제공하는 대로만 조회, 수정할 수 있도록 메소드를 제공한다.
1) Getter() : 값 조회 - 사용 방식 : getXxx()
2) Setter() : 값 변경 - 사용 방식 : setXxx()
set, get 사용시 멤버 필드들의 접근 제한자는 private
부모(Super) class의 속성(전역변수 = Field)과 method를 상속 받는 것
1) 매개변수를 이용한 다형성
: 메소드 인수
2) 필드를 이용한 다형성
: 변수
단 상속관계일때만 캐스팅 할 수 있다 (부모 > 자식)
public class Person{};
class SpiderMan extends Person{
boolean isSpider;
@Override
public int
};
public class Student extends Person{};
👇필드를 이용한 다형성👇
Person p = new SpiderMan();
Person p = new Student();
Person p = new Person();
p.name = "ok";
//p.isSpider = true; // 불가능. 다운 캐스팅을 통해 접근
//Spiderman sp = p; //부모 > 자식, 불가능
Spiderman sp = (Spiderman)p; // ObjectDownCasting
상속관계에서 Super(부모)class에 정의되어 있는 method를 Sub(자식) 클래스에서 재정의 하는 것.
👉 상속관계에서 재정의된 메서드는 자식클래스의 메서드가 호출된다.
1) modifier의 접근제한자는 반드시 부모 class의 제한자보다 크거나 같아야 한다 → 접근제한자 이외의 modifier(abstract)는 같아도 달라도 상관없다.
2) returnType, method명, 인수 무조건 같다.
3) 기능을 다르게 만든다.
→ 즉, 부모 class의 method 기능이 마음에 들지 않아 다른 기능으로 재정의.
4) final 제한자가 있다면 재정의 불가
this 키워드
: 생성된 현재 객체
1) this.변수이름 : 현재객체안에 있는 전역변수를 뜻한다.
2) this.메소드이름(값, 값,....) : 현재 객체안에 있는 메소드를 호출
3) this(값, 값,....) : 현재 객체안에 있는 생성자를 호출(반드시 생성자구현부 첫번째줄에서만 가능)
super 키워드
: 상속관계일때 자식안에서 부모를 부를때 사용하는 키워드
1) super.변수이름 : 부모클래스안에 있는 전역변수를 뜻한다.
2) super.메소드이름(값, 값,....) : 부모클래스안에 있는 메소드를 호출
3) super(값, 값,....) : 부모클래스에 있는 생성자를 호출(반드시 생성자구현부 첫번째줄에서만 가능)
class SuperClass{
protected int intNumber;
protected String memberString="Sting in SuperClass";
SuperClass(){
System.out.println("생성자 SuperClass()가 호출되었습니다.");
}
}
class SubClass extends SuperClass{
SubClass(){
memberString = "SubClass의 생성자가 입력한 String";
System.out.println("생성자 SubClass()가 호출되었습니다.");
}
}
출력결과
생성자 SuperClass()가 호출되었습니다.
생성자 SuperClass()가 호출되었습니다.
생성자 SubClass()가 호출되었습니다.
package day04.superEx;
class Animal{
// Animal(){
// System.out.println("Animal의 1");
// }
Animal(int i){
System.out.println("Animal(int i)의 2");
}
Animal(String s){
System.out.println("Animal(String s의 3");
}
}
class Pig extends Animal{ //pig is Animal 성립
Pig(){
this(4); //int형 받는 자기자신 생성자 호출
System.out.println("Pig()의 3");
}
Pig(int i){
super(i); //부모의 int 받는 생성자 호출
System.out.println("Pig(int i)의 4");
}
Pig(boolean b){
super(4); //부모의 String 받는 생성자 호출
System.out.println("Pig(boolean b)의 5");
}
}
public class SuperConstructorExam {
public static void main(String[] args) {
//new Pig();
//new Pig(5);
//new Pig(true);
//new Pig("hi"); //컴파일 에러
}
}
모든 자식 생성자 구현부 첫번째 줄에는 super() 생략되어있다.
반드시 부모의 기본 생성자가 필요하다.
만약 부모가 기본 생성자를 작성하지않아도
기본생성자가 자동으로 삽입되므로 문제없음
만약 부모가 기본 생성자가 2, 3만 있고 기본 생성자가 없다면
모든 자식 생성자 구현부 첫줄에서 에러가 난다.
package day04.overriding > ReferenceExam.java
println(Object obj) 메소드는 인수로 객체가 전달되면
obj.toString()을 자동으로 호출한다.
toString이 리턴하는 값을 출력
Object
ㄴ속성
ㄴ메서드 - toString() : getClass().getName() + '@' + Intger.toHexString(hashCode))
toString 은 자기 자신의 문자열을 리턴. 오버라이딩
@Override
public String toString(){
return str + " = " + super.
}