TIL

조지성·2022년 3월 18일
0

TIL

목록 보기
44/78
post-thumbnail

2022.03.18

  • 운영체제 강의 듣기
  • 스프링 117 ~ 140P

스프링

상속과 인터페이스

  • 인터페이스: 구현 클래스 is able to 인터페이스
  • 해석 : 구현 클래스는 인터페이스할 수 있다.
  • 예제 : 고래는 헤엄칠 수 있다.

상위클래스는 하위 클래스에게 특성(속성과 메서드)을 상속해 주고, 인터페이스는 클래스가 '무엇을 할 수 있다.'라고 하는 기능을 구현하도록 강제한다

상위클래스는 물려줄 특성이 풍성할수록 좋고, 인터페이스는 구현을 강제할 메서드의 개수가 적을수록 좋다

package ex03.inheritance02;

public class 동물 {
	String myClass; // 객체 변수
	
	public 동물() { // 생성자
		myClass = "동물";
	}
	
	void showMe() { // 객체 메서드
		System.out.println(myClass);
	}
}
package ex03.inheritance02;

public interface 날수있는 {
	void fly();
}
package ex03.inheritance02;

public interface 헤엄칠수있는 {
	void swim();
}
package ex03.inheritance02;

public class 포유류 extends 동물{
	public 포유류() {
		myClass = "포유류";
	}
}
package ex03.inheritance02;

public class 조류 extends 동물 {
	public 조류() {
		myClass = "조류";
	}
}
package ex03.inheritance02;

public class 고래 extends 포유류 implements 헤엄칠수있는 {
	public 고래() {
		myClass = "고래";
	}

	@Override
	public void swim() {
		System.out.println("고래헤엄");
	}
}
package ex03.inheritance02;

public class 박쥐 extends 포유류 implements 날수있는{
	
	public 박쥐() {
		myClass = "박쥐";
	}

	@Override
	public void fly() {
		System.out.println("박쥐날다");
	}
}
package ex03.inheritance02;

public class 참새 extends 조류 implements 날수있는{
	public 참새() {
		myClass = "참새";
	}

	@Override
	public void fly() {
		System.out.println("참새날다.");
	}
}
package ex03.inheritance02;

public class 펭귄 extends 조류 implements 헤엄칠수있는{
	public 펭귄() {
		myClass = "펭귄";
	}

	@Override
	public void swim() {
		System.out.println("펭귄헤엄치다");
	}
}
package ex03.inheritance02;

public class Driver {
	public static void main(String[] args) {
		날수있는 날라리1 = new 박쥐();
		날라리1.fly();
		
		날수있는 날라리2 = new 참새();
		날라리2.fly();
		
		헤엄칠수있는[] 맥주병들 = new 헤엄칠수있는[2];
		
		맥주병들[0] = new 고래();
		맥주병들[1] = new 펭귄();
		
		for(헤엄칠수있는 맥주병 : 맥주병들) {
			맥주병.swim();
		}
	}
}

상속과 T메모리

  • 하위 클래스의 인스턴스가 생성될 때 상위 클래스의 인스턴스도 함께 생성된다.
  • 모든 클래스의 최상의 클래스인 Object 클래스의 인스턴스도 함께 생성
package ex03.inheritance03;

//상위클래스

public class Animal {
	public String name;
	
	public void showName() {
		System.out.printf("안녕 나는 %s야. 반가워\n",name);
	}
}
package ex03.inheritance03;

public class Penguin extends Animal {
	public String habitat;
	
	public void showHabitat() {
		System.out.printf("%s는 %s에 살아\n",name,habitat);
	}
}
package ex03.inheritance03;

public class Driver {
	public static void main(String[] args) {
		
		Penguin pororo = new Penguin();
		
		pororo.name = "뽀로로";
		pororo.habitat = "남극";
		
		pororo.showName();
		pororo.showHabitat();
		
		Animal pingu = new Penguin();
		
		pingu.name = "핑구";
		//pingu.habitat = "EBS";
		
		pingu.showName();
		//pingu.showHabitat();
		
		//Penguin happy = new Animal();
		
	}
}

오버라이딩?오버로딩

  • 오버라이딩 : 같은 메서드 이름,같은 인자 목록으로 상위 클래스의 메서드를 재정의
  • 오버로딩 : 같은 메서드 이름 , 다른 인자 목록으로 다수의 메서드를 중복 정의

다형성과 T메모리

  • 상위 클래스 타입의 객체 참조 변수를 사용하더라도 하위 클래스에서 오버라이딩한 메서드가 호출
package ex03.polymorphism01;

public class Animal {
	public String name;
	
	public void showName() {
		System.out.printf("안녕 나는 %s야. 반가워\n",name);
	}
}
package ex03.inheritance03;

//상위클래스

public class Animal {
	public String name;
	
	public void showName() {
		System.out.printf("안녕 나는 %s야. 반가워\n",name);
	}
}
package ex03.polymorphism01;

public class Penguin extends Animal {
	public String habitat;
	
	public void showHabitat() {
		System.out.printf("%s는 %s에 살아\n",name,habitat);
	}

	//오버라이딩 : 재정의 - 상위클래스의 매서드와 같은 메서드이름, 같은 인자 리스트
	@Override
	public void showName() {
		System.out.println("내이름 알아서 뭐하게요!");
	}
	
	//오버로딩 : 중복정의 - 같은 메서드 이름, 다른 인자 리스트
	public void showName(String yourName) {
		System.out.printf("%s 안녕 나는 %s라고 해\n",yourName,name);
	}
}
package ex03.polymorphism01;

public class Driver {
	public static void main(String[] args) {
		Penguin pororo = new Penguin();
		
		pororo.name = "뽀로로";
		pororo.habitat = "남극";
		
		pororo.showName();
		pororo.showName("초보람보");
		pororo.showHabitat();
		
		Animal pingu = new Penguin();
		
		
		pingu.name = "핑구";

		
		//
		pingu.showName();

		
	}
}

캡슐화: 정보 은닉

  • 접근 제어자가 객체 멤버(인스턴스 멤버)와 쓰일 때와 정적멤버(클래스멤버)와 함께 쓰일 대를 비교

객체 멤버의 접근 제어자

Case 1. 멤버 변수, 같은 패키지

Case 2. 멤버 변수, 다른 패키지

Case 3. 정적 변수, 같은 패키지

Case 4. 정적 변수, 다른 패키지

참조 변수의 복사

  • 기본 자료형 변수를 복사하는 경우 Call By Value(값에 의한 호출)에 의해 그 값이 복사되며 두 개의 변수는 서로에게 영향이 없다
package ex03.reference;

public class CallByValue {
	public static void main(String[] args) {
		int a = 10;
		int b= a ;
		
		b = 20;
		
		System.out.println(a);
		System.out.println(b);
	}
}
  • 객체 참조 변수는 저장하고 있는 값을 주소로 해석
package ex03.reference;

public class CallByReference {
	public static void main(String[] args) {
		Animal ref_a = new Animal();
		Animal ref_b = ref_a;
		
		//둘 다 같은 곳을 가리킴
		ref_a.age = 10;
		ref_b.age = 20;
		
		System.out.println(ref_a.age);
		System.out.println(ref_b.age);
	}
}

class Animal{
	public int age;
}
profile
초보 개발자의 성장기💻

0개의 댓글