어제 거 복습!

public class Init {

	int num = 10;
	static int sNum = 100;
	
	
	//인스턴스 초기화 블럭: Test에서 객체가 생성될 때 호출
	{
		System.out.println("인스턴스 초기화 블럭"); //순서4
		System.out.println("인스턴스 변수 num = " + num); //순서5
		num = 1; //순서6
		sNum = 800; //객체가 생성되기 전에 클래스가 먼저 저장공간이 생기기 때문에 클래스 변수 호출은 가능
	}
	
	//클래스 초기화 블럭: 클래스가 생성될 때 호출
	static {
		System.out.println("클래스 초기화 블럭"); //순서1
		System.out.println("클래스 변수 sNum = " + sNum); //순서2
		sNum = 200; //순서3
		//객체가 생성되지 않아서(저장 공간이 없음) num값을 호출할 수 없음
	}
	
	//생성자: 객체가 생성될 때 호출
	Init() {
		System.out.println("생성자 호출"); //순서7
		System.out.println("인스턴스 변수 num = " + num); //순서8
		System.out.println("클래스 변수 sNum = " + sNum); //순서9
		num = 2;
		sNum = 500; //순서10
	}

보통 다 쓰진 않고 클래스 초기화는 별로 안 쓰고 거의 생성자를 많이 하고 아니면 인스턴스 초기화 블럭과 생성자 중 택1로 프로그래밍함



상속(inheritance)

기존의 클래스를 재사용해서 새로운 클래스를 작성하는 것.
하위 클래스는 상위 클래스의 모든 멤버를 상속 받는다.(생성자, 초기화 블럭 제외)

class 하위클래스 extends 상위클래스

class point3D extends point{
}

*new 해서 객체 생성 후 가져오는 건 사용할 수도 있고, 사용 안 할 수도 있어서 하는 거고
상속으로 가져오는 거는 반드시! 사용하게 돼서 상속을 쓰고 가져옴


*몰라도 된대 근데 어차피 나중엔 알아야 될 것 같아서 적어놓는다
상속관계(is-a): '-은 -이다'
포함관계(has-a): '-은 -을 가지고 있다'

Circle is a Point
원은 점이다.
Circle has a Point
원은 점을 가지고 있다.

  • 상속 관계 예시!
package inheritance03;

class A {
	int aa = 1;
}

class B extends A {
	int bb = 10;
}

class C extends B {
	int cc = 30;
}

public class InheritanceTest01 {

	public static void main(String[] args) {

		C objC = new C();
		System.out.println("aa = " + objC.aa);
		System.out.println("bb = " + objC.bb);
		System.out.println("cc = " + objC.cc);
		
		B objB = new B();
		System.out.println("aa = " + objB.aa);
		System.out.println("bb = " + objB.bb);
		//System.out.println("cc = " + objB.cc); 상속 범위 초과. 사용 불가.
		
		A objA = new A();
		System.out.println("aa = " + objA.aa);
		//System.out.println("bb = " + objA.bb);
		//System.out.println("cc = " + objA.cc); 상속 범위 초과. 사용 불가.
	}

}

*연습문제*
//Phone:공통 속성, 전화송수신/ CellPhone: Phone상속, 문자, 동영상 /SmartPhone:CellPhone상속, 카톡, 인터넷 /PhoneTest: 실행


  • 상속에서의 객체 생성
package inheritance03;

class AA {
	int i, j;
	void setIJ(int x, int y) {	//보통 값을 넣을 때는 set, 값을 얻어올 때는 get 키워드 사용
		i = x;
		j = y;
	}
}

class BB extends AA {
	int total;
	int sum() {
		total = i + j;	//AA 상속받아서 사용가능.
		return total;
	}
}

public class InheritanceTest02 {

	public static void main(String[] args) {

		BB b1 = new BB();	//BB가 AA를 상속받았기 때문에 AA의 i,j의 객체 저장공간도 자동으로 생성됨. 그래야 사용가능하니까.
		b1.setIJ(30, 70);
		System.out.println(b1.sum());
        
        => 100
	}

}

  • 상속에서의 변수 사용 우선순위
package inheritance03;

class A1 {
	int i;
}

class B1 extends A1 {
	String i;
}

public class InheritanceTest03 {

	public static void main(String[] args) {

		B1 b1 = new B1();
		b1.i = "kh정보교육원";
		System.out.println(b1.i);
		// 우선순위는 하위 클래스에 변수가 있으면 먼저 실행됨.
		//b1.i = 100; 오류남. 제일 먼저 B1의 i를 보니 String 형태의 kh~가 들어가있기 때문에 정수는 쓸 수 없음.
		
		A1 a1 = new A1();
		a1.i = 100;	//얘는 가능~
	}

}

  • 생성자 상속이 반드시는 안 되는 이유
package super07;
class Parent2 {
	int x;
	Parent2(int x) {	//매개변수를 넣는 순간 오류.
		this.x = x;
		System.out.println("부모 생성자");
	}
}
class Child2 extends Parent2 {	//상속을 받으려면 상위 클래스에서 객체가 생성되고 그걸 받는 건데 상위 보니까 x값을 할당해야 객체가 만들어짐
	int x = 100;
	Child2() {
		super(3); //x에 해당하는 값을 하위 클래스에서 명시적으로 넣어줘야 오류가 나지 않음.
		System.out.println("자식 생성자");
	}
}
public class SuperTest3 {
	public static void main(String[] args) {

		Child2 ch2 = new Child2();
	}

}

*연습문제*
//부모클래스 변수 1개(a의 제곱값), 생성자(매개변수 int형 1개){매개변수의 값 a의 제곱을 하여 인스턴스 변수에 저장}
자식클래스 변수 1개(b의 제곱값), 생성자(int a, int b){매개변수의 값 b의 제곱을 하여 인스턴스 변수에 저장}

아싸~ 오류나는 거 잘 해결해가며 풀었다~ 성장한 것 같아서 기쁘다!

*'extends Object':

아무것도 상속받지 않으면 컴파일러가 'extends Object'를 컴파일함.
-Object: 최상위 클래스라서 모든 클래스들이 상속받음.
해시코드의 메서드들을 가지고 있음.



오버라이딩(overriding):

*override: ~위에 덮어쓰다
오버로딩(매개변수의 개수와 타입이 다름/이름만 같을뿐, 새로운 메소드를 정의하는 것)이랑 헷갈리지 않게 주의!
-상속일 때만 사용.
-상위 클래스로부터 상속받은 메소드 내용만을 하위 클래스에 맞게 변경하는 것. 이름, 매개변수, 리턴타입 모두!!!똑같아야 한다.
-변경하면 무조건 하위 클래스의 수정된 값이 출력됨! 내 데이터를 먼저 살펴보니까!

class parent {
	void parentMethod() { a }
}
class child extends parent {
void parentMethod() { b } 
}

  • super 키워드: 상위 클래스의 변수나 메소드를 가리킴, this와 같은 용도.
    *this: 자신의 객체를 가리킴
package super07;
class Parent {
	int x = 10;
}
class Child extends Parent{
	int x = 100;
	void method() {
		int x = 1000;
		System.out.println("x=" + x);	//지역변수 x가리킴, 지역변수 없었으면 인스턴스 변수 x 가리킴
		System.out.println("this.x=" + this.x);	//인스턴스 변수 x 가리킴
		System.out.println("super.x=" + super.x); //상위클래스 x 가리킴, 상위 클래스에 x가 없었다면 오류남.
	}
}
public class SuperTest {

	public static void main(String[] args) {

		Child ch = new Child();
		ch.method();
	}

}

profile
내 인생을 망치러 온 나의 구원, 개발

0개의 댓글