본문 바로가기
프로그래밍/Java

[Java] Java의 문법(상속, 캐스팅, 오버라이딩, 키워드)

by 공프 Gongp 2023. 6. 21.
반응형

객체지향의 장점:

Data Structure, Abstraction, Encapsulation, Inheritance, Polymorphism

  • 자료구조, 추상화, 캡슐화, 상속, 다형성을 활용하여 재사용성을 높이며 보다 효율적으로 코드를 관리할 수 있다.
  • 단, 객체지향을 사용하면 속도가 느려질 수 있으나 속도가 중요한 코드를 작성한다면 C와 같은 절차지향언어를 활용해야 한다.

(Inheritance) 상속이란?

부모의 메소드를 물려받아 자식이 사용하는 것으로,

중복으로 사용되는 코드가 있을 때,

이 부분을 하나의 클래스로 묶어 최상위 클래스에 올려놓은 뒤,

상속을 통해 해당 클래스에 접근하여 사용하도록 하는 것이다.

상속의 장점 :

  1. 코드의 중복성을 제거할 수 있다.
  2. 다형적으로 표현할 수 있다.(Polymorphism, 다형성)

상속의 키워드 : extends

ex) 아래 코드와 같이 사용한다.

class (자식클래스) extends (부모클래스){ }

JAVA와 C# 등에서는 다중 상속이 불가하다. 대신 일부언어에서는 이를 대신할 인터페이스 제공한다.

(객체지향 언어중에서도 일부는 다중상속이 가능하다. ex, 파이썬 등)


package와 import를 이용하여 여러 파일의 코드관리

package (패키지명)
import (패키지명.클래스명)
//*를 사용하여 import시 하위폴더는 import 되지않으며, 클래스 파일들만 import된다.
//내가 언급한 패키지명과 같은 지위를 가진 클래스만 improt.

//a는 root로 최상위 부모클래스

//b는 a를 상속받는 자식클래스이자 c와 d의 부모클래스

//c와 d는 공통으로 b를 상속 받는 자식클래스 (B이자 C / B이자 D)

A는 A다. A a1 = new A(); //A메소드에 생성.

B는 A다. A a2 = new B(); //A를 상속받는 B메소드 생성.


A a = new A();

B b = new B();

C c = new C();

D d = new D();

//동일한 타입으로 메소드 선언.


A a1 = new B();

A a2 = new C();

A a3 = new D();


B b1 = new C();

B b2 = new D();

B b1 = new A();C c1 = new B(); 처럼 부모는 자식클래스에 함부로 접근 불가.


< 상속 이해를 위한 코드 정리 >

public class Main {
	class Human{
		String name;
		int age;
		void eat(){	
		}
		void sleep(){	
		}
	}
	class Student extends Human
	{
		int studentID;
		void goToSchool(){	
		}
	}
	class Worker extends Human
	{
		int workerID;
		void goToWork(){
		}
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Human hu = new Human();
		Student stu = new Student();
		Worker wor = new Worker();
		
		hu.name = "일반인"; //Human 클래스의 변수할당.
		hu.age = 20;
		hu.eat();//Human 클래스의 메소드 호춣.
		hu.sleep();
		
		stu.name = "이학생";//부모클래스인 Human 클래스에 접근하여 변수선언.
		stu.age = 16;
		stu.eat();//부코클래스인 Human클래스에 접근하여 메소드호출.
		stu.sleep();
		stu.studentID = 20201290;//Student 클래스의 변수 할당.
		stu.goToSchool();//Student 클래스의 메소드 호출.
		
		wor.name = "회사원";//부모클래스인 Human 클래스에 접근하여 변수선언.
		wor.age = 30;
		wor.eat();//부코클래스인 Human클래스에 접근하여 메소드호출.
		wor.sleep();
		wor.workerID = 120;//Worker 클래스의 변수 할당.
		wor.goToWork();//Worker 클래스의 메소드 호출.
	}
}

객체의 타입변환 (Upcasting/Downcasting)

A a = new B(); B b = (B) a; C c = (C) a; //error

캐스팅(casting): 형변환하는 행위.

업캐스팅(Upcasting): 자식클래스를 부모클래스의 타입으로 형변환시키는 것.(부모타입←자식타입)

다운캐스팅(Downcasting): 업캐스팅된 것으로 하위타입 또는 원래상태로 돌려놓는 것.

class A{
}
class B extends A{
}
class C extends B{
}
class D extends B{
}
//업캐스팅(Upcasting)
A c1 = (A) new C(); //자동 업캐스팅
B c2 = (B) new C(); //자동 업캐스팅

B b1 = new B(); //B객체 생성.
A a = (A) b1; //A타입의 B로 Upcasting

//다운캐스팅(Downcasting)
A a1 = new A(); //A객체 생성.
//error B b = (B) a1;//A객체를 B타입으로 변환불가.
//error C c = (C) a1;//A객체를 C타입으로 변환불가.

A b2 = new B(); //A타입의 B객체 생성.
B b = (B) b2; //B타입으로 다운캐스팅.
//error C c = (C) b2; //C타입으로 변환불가.

B d1 = new D();//B타입의 D객체 생성.
D d = (D) bd;//D타입으로 다운캐스팅.

A d2 = new D();//A타입의 D객체생성.
B b3 = (B) d2;//B타입으로 다운캐스팅.
D d1 = (D) d2;//D타입으로 다운캐스팅.
A a1 = new A();//A타입의 A생성자
B b1 = new B();//B타입의 B생성자
A ab = new B();//A타입의 B생성자, 다형성


참조변수 instanceof 타입 (true/false)

instanceof로 상속받는 지 확인

A a = new B(); //A를 상속받은 B객체 선언. if(a instanceof B){ //true B b = (B) a; }
A a = new A(); //A객체 선언. if(a instanceof B){ //false B b = (B)a; }

오버라이딩(Overriding) ↔ 오버로딩(Overloading)

메소드 오버라이딩(Method Overriding)

부모클래스에서 상속받은 메소드를 재정의하여 사용하는 것이다. (덮어쓰기)

<메소드 오버라이딩을 위한 조건>

  1. 부모클래스의 메소드와 시그니처 및 리턴타입이 동일해야한다.
  2. 부모클래스의 메소드보다 접근지정자가 같거나 포괄적이어야 한다.
  3. 인스턴스 메소드에서만 가능하다. (인스턴스 필드 / 정적필드 / 정적메소드에서는 오버라이딩 불가)
class A{ void print1(){ ... } void print2(){ ... } }
class B extends A{ @Override void print1(){ ... //Overriding } void print2(int a){ ... //Overloading } }

 

* @Override는 자식 클래스에 여러개의 클래스가 있을 경우,

어떤 클래스가 상속되었는지 알아보기 위해 명시적으로 표시하는 주석 역할의 Annotation이다.


super 키워드와 super() 메소드

super.(메소드명)(); 
 //부모클래스에 있는 (메소드명)과 같은 이름의 메소드 호출. super(); 
 //부모클래스에 있는 생성자 호출
반응형

'프로그래밍 > Java' 카테고리의 다른 글

[Java][용어 정리] 생성자, 키워드, Object  (0) 2023.06.21