객체 지향 프로그래밍 (Object Oriented Programming, OOP)은 각각의 기능들을 객체화하여 main 함수에서 객체화 시킨 기능들을 호출하며 사용하는 프로그래밍 기법으로 캡슐화, 상속, 다형성의 특징을 가지고 있다.
캡슐화 (Encapsulation)
자바에서의 캡슐화란, 값의 보호를 위해 객체의 필드, 메소드를 필요에 의해 감추거나 들어내는 것(은닉성
)을 말한다.
필드와 메소드를 보호하는 이유는 외부로부터의 잘못된 접근으로 인해 객체의 데이터나 메소드에 유효하지 않은 값이 들어가서 시스템 전체에 영향을 끼치는 것을 방지하기 위해서이다. 클래스 내의 변수나 함수를 감추거나 드러내는 은닉성은 자바에서 접근제어자를 통해 실형시킬 수 있다.
* 접근제어자
public
: 모든 클래스에서도 접근 가능protected
: 동일 패키지 내의 클래스나 해당 클래스를 상속받은 클래스에서 접근 가능default
: 동일 패키지 내의 클래스에서 접근 가능private
: 자기 자신 클래스에서만 접근 가능
* 참고. 접근제어자 바로가기
상속 (Inheritance)
상속은 자식클래스에서 부모클래스로부터 부모의 자원을 물려받는 것을 말한다. 예약어 extends
에 의해서 정해진다.
하나의 부모클래스가 여러 자식클래스를 가지는 것은 가능하지만 하나의 자식클래스가 여러 부모클래스를 상속받을 수는 없다. 상속 되지 않는 요소로는 생성자와 private 변수 및 메소드 가 있다.
- 비효율적인 코드 중복 방지
- 유지보수 용이
💡 super 키워드
super();
super([값,..]);
: 부모의 생성자 호출- 자식클래스의 생성자 첫 줄에서만 사용 가능. 명시적으로 지정하지 않으면 자동으로 삽입된다.
- 부모 클래스에서 선언된 변수를 부모 클래스에서 초기화하기 위해서 호출
다형성 (Polymorphism)
다형성은 여러 형태를 가질 수 있는 것으로 하나의 객체가 여러 가지 타입을 가질 수 있는 것을 말한다.
자바에서의 다형성은 상속을 전제로 하며 부모클래스 타입의 변수가 자식클래스 타입의 객체를 가질 수 있다. 따라서 각각의 자식 클래스의 특징을 가진 인스턴스들이 동일한 데이터 타입을 가지게 되어 메소드를 실행시키기가 간편해진다.
다형성 적용 시 하나의 배열에 여러가지 타입의 객체 저장이 가능하다 (상속 전제) 배열에서 각각의 자식 클래스 객체를 식별하는 방법은 instanceof
연산자를 이용한다. 여기서 부모클래스에는 없고 자식 클래스에서 추가한 멤버(변수, 메소드)에 접근하려면 자식클래스로 형변환이 필요하다.
🔔 다형성 활용 1. 배열
// 부모클래스 Pet의 자식 클래스 Cat, Dog, Bird
// 생성자는 Pet(name, age) Cat(name, age) Dog(name, age, sex) Bird(name, age, color)
Pet [] pets = {new Cat("야옹이", 2),
new Dog("멍뭉이", 1, "수컷"),
new Dog("멍뭉이2", 2, "암컷"),
new Cat("야옹이2", 1),
new Bird("짹짹이", 1, "블랙"),
new Cat("야옹이3", 4) };
// 배열에서 어떤 자식클래스 타입인지 식별하는 방법
// 변수 instanceof 타입 연산자
for(Pet p : pets) {
// 고양이만 출력
if(p instanceof Cat)
System.out.printf("Cat 이름 : %s, Cat 나이 : %d \n", p.getName(), p.getAge());
}
// 부모클래스에는 없고 자식클래스에만 추가된 멤버 접근은 자식 타입으로 형변환 해야한다.
for(Pet p : pets) {
if(p instanceof Dog)
System.out.printf("Dog 이름 : %s, Dog 나이 : %d Dog 성별 : %s\n", p.getName(), p.getAge(), ((Dog) p).getSex());
// Dog 클래스의 멤버인 getSex() 는 부모 클래스 Pet에 없다. ==> 접근 시 형변환 필요
}
🔔 다형성 활용 2. 오버로딩
public static void a (Pet p) {
// 파라미터로 다형성 적용
}
public static void b (Object obj) {
// 파라미터로 다형성 적용
}
public static void main(String[] args) {
Cat c = new Cat("야옹이", 2);
Dog d = new Dog("초코", 2, "수컷");
Bird b = new Bird("까치", 2, "검정");
a(c);
a(d);
a(b);
// 확장
b(10);
b(3.14);
b(true);
b("hello");
}
💡 오버로딩
하나의 클래스안에 동일한 이름의 메소드
나 생성자
가 사용 가능하다. 반드시 인자리스트가 달라야 한다.
💡 오버라이딩
상속 관계에서 부모의 메소드
를 자식클래스가 수정하여 사용 가능하다. 부모 클래스 메소드의 접근 제어자보다 더 넓은 범위의 접근 제어자를 자식 클래스 메소드에서 설정할 수 있다.
단, 오버라이딩하고자 하는 메소드 이름, 매개변수, 리턴 값이 모두 같아야 한다. 부모가 final, static, private 으로 지정된 메소드는 오버라이딩 불가. @Override
지정
구분 | 오버로딩(Overloading) | 오버라이딩(Overriding) |
---|---|---|
접근 제어자 | 모든 접근 제어자 사용 가능 | 부모클래스 메소드의 접근 제어자보다 더 넓은 범위의 접근 제어자를 자식클래스 메소드에서 설정 가능 |
리턴형 | 달라도 됨 | 동일해야 함 |
메소드명 | 동일해야 함 | 동일해야 함 |
매개변수 | 반드시 달라야 함 | 동일해야 함 |
적용 범위 | 같은 클래스 내에서 적용 | 상속 관계에서 적용 |
'Language > JAVA' 카테고리의 다른 글
[JAVA] 추상 클래스와 인터페이스 (0) | 2023.07.24 |
---|---|
[JAVA] super super() (0) | 2023.07.24 |
[JAVA] static 변수와 메서드 (0) | 2023.07.24 |
[JAVA] 자바의 접근 지정자(access modifier) (0) | 2023.07.24 |
[JAVA] 생성자와 this (0) | 2023.07.24 |