[Java] 정보은닉과 상속

JOY·2023년 3월 7일
0

[Java]

목록 보기
7/15
post-thumbnail

정보 은닉

  • Data(속성)를 외부의 접근으로부터 보호하기 위한 방법(직접 접근할 수 없도록),
    코드의 유지보수를 용이하게 함
class Student{
	private String name;
    int age; //18보다 큰 나이만 허용 가능
}
Student st = new Student();
st.age = 2; //오류는 아니지만 시나리오 입장에서 오류

모호한 데이터가 수정되거나 조회되지 않도록
개발자가 제공하는 대로만 조회, 수정할 수 있도록 메소드를 제공한다.

1) Getter() : 값 조회 - 사용 방식 : getXxx()
2) Setter() : 값 변경 - 사용 방식 : setXxx()

set, get 사용시 멤버 필드들의 접근 제한자는 private

  • 구현 방법
    1) setXxx 규칙
    - 제한자 : public
    - 리턴타입 : 필수
    - 메소드 이름 : get필드명();
    - 인수 : 없음
    2) getXxx 규칙
    - 제한자 : public
    - 리턴타입 : 필수
    - 메소드 이름 : get필드명();
    - 인수 : 없음

상속

부모(Super) class의 속성(전역변수 = Field)과 method를 상속 받는 것

  • 부모 class의 생성자와 private 요소를 제외한 모든 것을 상속받는다.
  • 부모 class의 method와 속성을 별도의 선언 없이 내안에 있는 것처럼 접근하여 사용한다.
  • 단일 상속만 가능
  • class A extends B {} => A가 B를 상속 받는다.
  • Java의 모든 class는 Object(class)를 상속받는다. (Java의 최고 조상)
  • 상속 관계일 때 캐스팅 할 수 있다.
  • 같은 부모를 상속 받는다 하더라도 같은 부모를 공유하는 것은 아님
  • 재사용 하기 위한 공통의 기능, 메서드 관리

다형성

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
	

오버라이딩(재정의; Overriding)

상속관계에서 Super(부모)class에 정의되어 있는 method를 Sub(자식) 클래스에서 재정의 하는 것.
👉 상속관계에서 재정의된 메서드는 자식클래스의 메서드가 호출된다.

1) modifier의 접근제한자는 반드시 부모 class의 제한자보다 크거나 같아야 한다 → 접근제한자 이외의 modifier(abstract)는 같아도 달라도 상관없다.
2) returnType, method명, 인수 무조건 같다.
3) 기능을 다르게 만든다.
→ 즉, 부모 class의 method 기능이 마음에 들지 않아 다른 기능으로 재정의.
4) final 제한자가 있다면 재정의 불가

this(), super()

  • 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.
}
profile
Just Do IT ------- 🏃‍♀️

0개의 댓글