[JAVA] 객체지향 프로그래밍 OOP
자바의 객체지향 프로그래밍(OOP)을 이야기 할 때,
3대 개념이라고 해서 Encapsulation, Inheritance, Polymorphism 을 이야기 하기도 하고,
여기에 Abstraction를 추가해서 APIE라고 하기도 한다.
java oop concepts을 구글링하면 여러분류를 알아볼 수 있으며, 대체적으로 아래의 속성들을 이야기한다.
- 추상성 (Abstraction)
- 다형성 (Polymorphism)
- 상속성 (Inheritance)
- 은닉성 (Encapsulation)
- 클래스 (Class)
- 객체 (Object)
- 메서드 (Method)
검색결과에서 모듈성1도 보이는데, 이는 OOP이전에 대표적인 프로그래밍 패러다임인 C의 절차식 프로그래밍(Procedural programming)2에서도 공통적으로 볼 수 있는 특징이기에 따로 정리는 안하겠다.
모듈성은 객체 지향 프로그래밍에서 ‘객체(Object)’를 사용하여 더 세련되게 구현 가능 하다고 보면 된다.
위 7개중 아래 3개 항목인 클래스, 객체, 메서드는 구성요소로 분류하고, 나머지는 특징으로 나누어서 정리해보겠다.
OOP(Object Oriented Programming) 프로그래밍 특징 (APIE)
추상성 (Abstraction)
- 관련없는 세부 사항을 무시하고 객체의 필요한 특성만 식별하는 프로세스로 정의
- 추상클래스를 상속받은 자식클래스에서 추상메서드의 구현부를 완성해야 함(강제상속)
추상클래스
- 클래스내 추상메소드가 선언되어 있음
- 추상클래스는 자기 이름으로 자신의 객체를 생성 할 수 없음
추상메소드
- 추상메소드는 선언부는 작성하고 구현부는 작성하지 않음 (추상메소드임을 알림)
- 일반메소드가 추상 메소드를 호출 할 수 있음
장점
- 객체를 보는 복잡성을 줄여 줌
- 코드 복제를 방지하고 재사용성(reusability)을 높힘.
- 중요한 세부 정보만 사용자에게 제공되므로, 응용 프로그램이나 프로그램의 보안이 강화
예제
//추상클래스 A
abstract class A{
//추상메소드 b()
public abstract int b();
//추상클래스내 추상메소드가 아닌 메소드 존재 가능
public void d(){
System.out.println("world");
}
}
//클래스 B는 추상 클래스 A를 상속
class B extends A{
// 추상클래스 A의 추상 메소드인 메소드 b를 오버라이딩
@Override
public int b(){
return 1;
}
}
public class AbstractDemo {
public static void main(String[] args) {
//클래스 A를 상속받은 B클래스를 인스턴스화 하여 결과적으로는 추상 클래스 A를 사용 하게 됨
B obj = new B();
System.out.println(obj.b());
}
}
output
1
다형성 (Polymorphism)
- 동일한 이름을 가진 엔티티를 효율적으로 구별하는 능력
- Overloading , Overriding
- Reference 다형성 : 부모의 타입으로 자식의 객체를 생성하는 레퍼런스 다형성
- Argument 다형성 : 부모의 이름으로 자식의 타입을 받는 아규먼트 다형성
- Method 다형성 : 부모의 이름으로 자식을 생성하거나 받은 다음, 부모 쪽에 있는 메서드를 호출하면 오버라이딩 된 자식 메서드가 호출
예제
- Overloading도 다형성의 한 예제
class {
public void a(int param){
System.out.println("숫자출력");
System.out.println(param);
}
public void a(String param){
System.out.println("문자출력");
System.out.println(param);
}
}
public class PolymorphismOverloadingDemo {
public static void main(String[] args) {
O o = new O();
o.a(1);;
o.a("one");
}
}
output
숫자출력
1
문자출력
one
상속성 (Inheritance)
- 한 클래스가 기존 클래스를 재사용 하기 위해 상속
- extends를 사용하여 부모클래스(Parent Class)(=기본클래스(base class), 상위클래스(super class))의 필드, 메소드를 물려받음
- 다른 클래스를 상속하는 자식 클래스(Child Class)(= 파생 클래스(derived class), 확장 클래스, 서브클래스(sub class), 하위 클래스)에서는 자체 필드, 메소드 추가 가능
- 오버라이딩 은 상속관계가 성립했을 때에만 이루어 짐
예제
class Animal{
void eat(){
System.out.println("eating...");
}
}
class Dog extends Animal{
void bark(){
System.out.println("barking...");
}
}
class TestInheritance{
public static void main(String args[]){
Dog d=new Dog();
d.bark();
d.eat();
}
}
output
barking...
eating...
은닉성 (Encapsulation)
- 단일 단위로 데이터를 래핑하는 것
- 데이터 보호를 위해 멤버필드르 메서드를 통해 접근하는 것
- 클래스가 숨겨짐으로 data-hiding 이라고도 함
- 접근제한자(private)로 속성들을 생성하여 클래스 밖에서 접근하여 변경하지 못하게 함
- 멤버필드는 private를 사용하고 메서드는 public을 사용하여 멤버필드를 보호하는 것
접근제한자
접근제한자는 필드, 메소드, 생성자 또는 클래스의 액세스 가능성 또는 범위를 지정하여 은닉성을 가능하게 하는 특징
- pirvate : -, 오직 클래스 내에 서만 접근 가능. 클래스 외부에서는 접근 할 수 없음
- default : ~, 같은 패키지에서 접근 가능. 패키지 외부에서 접근 할 수 없음. 접근제한자를 지정하지 않으면 이것이 기본값
- protected : #, 내부 패키지와 하위 클래스를 통한 외부 패키지에서 접근 가능. 즉, 자식 클래스를 만들지 않으면 패키지 외부에서 접근 할 수 없음. (상속일 경우 어디서나 접근 가능)
- public : +, 어디에서나 접근가능. 클래스 내, 외부 클래스, 패키지 내 및 패키지 외부에서 접근 가능.
public > protected > default > private
references
https://ko.wikipedia.org/wiki/%EA%B0%9D%EC%B2%B4_%EC%A7%80%ED%96%A5_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D
https://www.geeksforgeeks.org/object-oriented-programming-oops-concept-in-java/?ref=lbp
https://opentutorials.org/module/516/6062
https://opentutorials.org/module/516/6127
https://www.javatpoint.com/inheritance-in-java
https://www.javatpoint.com/runtime-polymorphism-in-java