TIL(2022.03.16)

조지성·2022년 3월 16일
0

TIL

목록 보기
43/78
post-thumbnail

클래스 멤버 VS 객체 멤버 = static 멤버 vs 인스턴스 멤버

  • 객체
    - 유일무이하게 존재하는 실체
    - 속성에 값을 가지고 있다
  • 클래스
    - 개념
    - 분류 체계
    - 속성에 값을 가질 수 없다

=> 같은 클래스의 모든 객체가 같은 값을 가지고 있다면 그 값을 클래스에 저장하면 메모리를 아낄수 있다!

package ex03.abstraction02;

public class Mouse {
	public String name;
	public int age;
	public static int countOfTail = 1; // 쥐 , 제리 , 미키의 꼬리는 모두 1개이므로 같은 유형의 모든 객체가 같은 값을 가지고 있다면 클래스 속성에 저장
	
	public void sing() {
		System.out.println(name +" 찍찍!!");
	}
}
package ex03.abstraction02;

public class MouseDriver {
	public static void main(String[] args) {
		Mouse.countOfTail = 1;
		
		
		Mouse mickey = new Mouse();
		Mouse jerry = new Mouse();
		Mouse mightyMouse = new Mouse();
		
		//객체 참조 변수.속성명으로 접근
		System.out.println(mickey.countOfTail); 
		System.out.println(jerry.countOfTail);
		System.out.println(mightyMouse.countOfTail);
		
		//클래스명.속성명으로 접근
		System.out.println(Mouse.countOfTail);
		
	}
}
  • 클래스 멤버 = 정적 멤버 = static 멤버
    - static
    - 클래스 멤버 속성
    모든 객체들이 같은 값을 가질 때 사용하는 것이 정석 ,
    T메모리의 스태틱 영역에 클래스가 배치될 때 클래스 내부에 메모리 공간이 확보
    - 클래스 멤버 메서드
    객체들의 존재 여부에 관계없이 쓸 수 있는 메서드

  • 객체 멤버 = 인스턴스 멤버
    - 객체 멤버 속성
    속성명만 있지 실제 메모리 공간은 확보하지 않는다. 메모리 공간은 힙 영역에 객체가 생성되면 할당
    - 객체 멤버 메서드

  • 클래스 속성과 객체 속성은 별도의 초기화를 해주지않아고 정수형은 0 , 실수형은 0.0 , 논리형은 false , 객체는 null 로 초기화

  • 지역 변수는 별도로 초기화

상속: 재사용+확장

  • 객체지향에서의 상속은 상위 클래스의 특성을 하위 클래스에서 상속(특성 상속) 하고 거기에 더해 필요한 특성을 추가, 즉 확장해서 사용할 수 있다는 의미!!!
  • 상위클래스 - 하위클래스 = 슈퍼 클래스 - 서브클래스
  • 상위 클래스 쪽으로 갈수록 추상화, 일반화
  • 하위 클래스 쪽으로 갈수록 구체화,특수화
  • 하위 클래스는 상위 클래스이다
  • 상속 (extends)

상속의 강력함

package ex03.inheritance01;

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

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

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

public class 고래 extends 포유류 {
	public 고래() {
		myClass = "고래";
	}
}
package ex03.inheritance01;

public class 박쥐 extends 포유류{
	public 박쥐() {
		myClass = "박쥐";
	}
}
package ex03.inheritance01;

public class 참새 extends 조류{
	public 참새() {
		myClass = "참새";
	}
}
package ex03.inheritance01;

public class 펭귄 extends 조류 {
	public 펭귄() {
		myClass = "펭귄";
	}
}
package ex03.inheritance01;

public class Driver01 {
	public static void main(String[] args) {
		동물 animal = new 동물();
		포유류 mammalia = new 포유류();
		조류 bird = new 조류();
		고래 whale = new 고래();
		박쥐 bat = new 박쥐();
		참새 sparrow = new 참새();
		펭귄 penguin = new 펭귄();
		
		//상위 클래스에서만 showme()메서드를 구현했지만 하위 클래스 객체에서 showMe() 사용할 수 있다. => 재사용
		animal.showMe();
		mammalia.showMe();
		bird.showMe();
		whale.showMe();
		bat.showMe();
		sparrow.showMe();
		penguin.showMe();
	}
}
package ex03.inheritance01;

public class Driver02 {
	public static void main(String[] args) {
		
		// 하위클래스는 상위클래스이다.
		동물 animal = new 동물();
		동물 mammalia = new 포유류();
		동물 bird = new 조류();
		동물 whale = new 고래();
		동물 bat = new 박쥐();
		동물 sparrow = new 참새();
		동물 penguin = new 펭귄();
		
		animal.showMe();
		mammalia.showMe();
		bird.showMe();
		whale.showMe();
		bat.showMe();
		sparrow.showMe();
		penguin.showMe();
	}
}
package ex03.inheritance01;

public class Driver03 {
	public static void main(String[] args) {
		
		// 하위클래스는 상위클래스이다.
		동물[] animals = new 동물[7];
		
		animals[0] = new 동물();
		animals[1] = new 포유류();
		animals[2] = new 조류();
		animals[3] = new 고래();
		animals[4] = new 박쥐();
		animals[5] = new 참새();
		animals[6] = new 펭귄();
		
		for(int i=0;i<animals.length;i++) {
			animals[i].showMe();
		}
	}
}

상속은 is a kind of 관계

  • 하위 클래스 is a kind of 상위 클래스
  • 펭귄 is a kind of 조류

  • 객체 지향의 상속은 하위 클래스의 특성을 재사용
  • 객체 지향의 상속은 상위 클래스의 특성을 확장
  • 객체 지향의 상속은 is a kind of 관계를 만족

다중 상속과 자바

  • 자바가 다중 상속을 지원하지 않는 이유는 재사용이나 확장을 할 때 어떤 것을 재사용하고 확장할지 다중 상속인 경우 결정할 수 없기 때문이다.
    => 대신 인터페이스 를 도입했다.
profile
초보 개발자의 성장기💻

0개의 댓글