Develop/JAVA

0526 JAVA 여덟번째

포페PostFace 2022. 6. 1. 22:06

상속

 

class Parent{
	int x=10;
	void method() {
		System.out.println("P_x:"+x);
	}
}
class Child extends Parent{
	int x=20; // 만일 이 변수가 없다면
	void method() {
		int x=30; //지역변수
		System.out.println("x:"+x);
		System.out.println("this.x:"+this.x);
		System.out.println("super.x:"+super.x);
	}
}

우선 순위는 지역변수 인스턴스변수 상속된변수 순으로 되어있다.

 

위의 Child 클래스의 인스턴스 변수가 없다면

this.x는 부모클래스인 Parent클래스에서의

인스턴스 변수를 호출한다.

 

지역변수가 없다면 클래스 안의 인스턴스 변수를

그마저도 없다면 부모클래스의 인스턴스 변수를 호출한다.

 

class Per{
	String name;
	int age;
	Per(String name,int age){
		this.name=name;
		this.age=age;
	}
}
class Stu{
	int kor,eng,math;
//	String name;
//	int age;
	Per p; //Per 객체를 포함
	Stu(String name,int age,int kor,int eng,int math){
		p = new Per(name,age);
		this.kor=kor;
		this.eng=eng;
		this.math=math;
	}
}

Stu 클래스에서 Per클래스가 사용하는 멤버변수를

중복 사용한다면 상속만이 아닌 포함을 통해

멤버변수를 공유할 수 있다.

Stu내에 Per객체를 초기화 하고

Stu생성자 내에 선언을 함으로써

호출을 할 수 있는데

이는 Stu가 멤버변수를 가지고 있는게 아닌

Per에서 멤버변수를 가져오는 것이라

Per에서 생성자를 설정해줄 필요가 있다.

 

이 둘은 상속관계가 아니다.

 

메인에서 정보를 불러오기 위해선

Stu객체.Stu생성자에 만든 Per객체.멤버변수

로 작성해야한다.

 

또한 Stu클래스에서 메소드를 정의할때

포함된 변수를 불러오기 위해선

Stu에서 만든 Per객체를 앞에 붙여줘야 한다.

 

패키지

 

패키지란 클래스와 인터페이스를 하나의 패키지로

모아서 관리하는 것이다.(폴더와 같은 개념)

 

패키지를 만들땐 .을 통해 상위폴더와 하위폴더를 구분한다.

 

예를 들어 com.javastudy라는 패키지를 만들면

com 폴더 안에 javastudy라는 폴더가 생긴다.

 

한 프로젝트 폴더 안에 같은 클래스를 만들더라도

각각 다른 패키지에 있다면 중복 클래스라고 뜨지 않게된다.

 

다른 패키지의 클래스를 가져다 쓰고 싶다면

import 패키지명.클래스명; 을 통해

호출할 수 있으나 해당 클래스의 생성자와 메소드등을

public으로 만들어 줘야 한다.

 

접근 제어자 - public,protected,default,private

 

default = 따로 쓰지 않아도 자동으로 접근제어자로써 존재한다.

패키지가 같아야 접근할 수 있다.

 

protected=패키지가 다르면 자식만 가져다 사용할 수 있다.

(다른 패키지라면 상속이 되어있어야한다.)

 

public =다른 패키지에 있어도 접근이 가능하다.

 

private=같은 패키지에 있어도 접근이 불가능하다.

 

보통 부모클래스의 멤버 변수는 private를 걸고

메서드는 어디서든 접근할 수 있게 public을 건다.

부모클래스의 메소드가 public이라면

상속클래스의 메소드가 default라면 에러가 나기

때문에 같이 public으로 변경해줘야한다.

 

다른 패키지는 기본 패키지를 호출하기 힘들다.

 

import를 할때 패키지명.*을 쓰면

모든 클래스를 전부 쓰겠다는 뜻이다.

 

java.lang 패키지만이 유일하게 import없이 사용할 수 있다.

Scanner는 java.util 패키지에 들어가 있는 클래스다.

때문에 import를 해 줄 필요가 있다

 

. ctrl+shift+o를 통해 단축키로 import 시킬수 있다.

 

모든 클래스의 최상단은 패키지명 => import패키지

순으로 구성되어 있어야한다.

 

다형성

하나의 참조변수로 여러타입의 객체를 참조할 수 있는 것

 

부모와 자식 클래스간의 상속관계일 경우

각각의 객체의 변수를 만들면

자식객체 = 부모객체 를 할 수 있다.

 

Car2 c= new Car2();

FireEngine f= new FireEngine();

이었다면 c=(Car2)f; 를 통해 자식=>부모 타입의 변수에

넣을때  자동으로 부모타입에 맞춘다.(업케스팅 했다고 한다.)

 

Car2 c= new FireEngine();

FireEngine f= new FireEngine();

이 되는데 이를 다형성이라고 한다.

 

이 과정을 통해 부모클래스의 변수가

자식클래스의 변수로 바뀌게 되는데

이는 상속되었던 변수와 오버라이딩된 메소드만 쓸 수 있다.

 

다운캐스팅 예시

FireEngine f2= null;

f2=(FireEngine)c; //다운캐스팅 반드시 써야함.

 

부모타입의 변수값을 자식타입의 변수에 넣기위해

c를 자식타입으로 잠시간 바꿔줘야한다.

 

다운캐스팅은 업캐스팅한 적이 있어야지만 사용할 수 있다.

 

연산자 instanceof

 

이 연산자는 다운캐스팅이 가능한지 판별해주는 연산자다.

예시

if (객체 instanceof 클래스명) 
 	System.out.println("다운캐스팅 가능");
else 
	System.out.println("다운캐스팅 불가능");

이런식으로 사용할 수 있다.

업캐스팅을 활용하면 자식객체를 부모클래스를 통해 배열화해서 관리할 수 있다.

'Develop > JAVA' 카테고리의 다른 글

0530 JAVA 열번째!!  (0) 2022.06.01
0527 JAVA 아홉번째  (0) 2022.06.01
0525 JAVA 일곱번째  (0) 2022.06.01
0524 JAVA 여섯번째  (0) 2022.06.01
0523 JAVA 다섯번째  (0) 2022.06.01