
객체지향의 장점:
Data Structure, Abstraction, Encapsulation, Inheritance, Polymorphism
- 자료구조, 추상화, 캡슐화, 상속, 다형성을 활용하여 재사용성을 높이며 보다 효율적으로 코드를 관리할 수 있다.
- 단, 객체지향을 사용하면 속도가 느려질 수 있으나 속도가 중요한 코드를 작성한다면 C와 같은 절차지향언어를 활용해야 한다.
(Inheritance) 상속이란?
부모의 메소드를 물려받아 자식이 사용하는 것으로,
중복으로 사용되는 코드가 있을 때,
이 부분을 하나의 클래스로 묶어 최상위 클래스에 올려놓은 뒤,
상속을 통해 해당 클래스에 접근하여 사용하도록 하는 것이다.
상속의 장점 :
- 코드의 중복성을 제거할 수 있다.
- 다형적으로 표현할 수 있다.(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)
부모클래스에서 상속받은 메소드를 재정의하여 사용하는 것이다. (덮어쓰기)
<메소드 오버라이딩을 위한 조건>
- 부모클래스의 메소드와 시그니처 및 리턴타입이 동일해야한다.
- 부모클래스의 메소드보다 접근지정자가 같거나 포괄적이어야 한다.
- 인스턴스 메소드에서만 가능하다. (인스턴스 필드 / 정적필드 / 정적메소드에서는 오버라이딩 불가)
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 |
---|