Java에서의 OOPS 개념 – OOPS 개념 예제

객체 지향 프로그래밍 개념은 프로그래밍에 매우 중요합니다. OOPS 개념에 대한 아이디어가 없으면 객체 지향 프로그래밍 모델에서 시스템을 설계할 수 없습니다.

객체 지향 프로그래밍 모델이란 무엇인가요?

객체 지향 프로그래밍 모델은 객체 개념을 중심으로 돌아갑니다. 객체란 무엇인가요? 객체는 클래스의 인스턴스입니다. 속성과 함수를 포함하고 있습니다. 실제 세계의 객체와 비슷합니다. 예를 들어, 당신의 차, 집, 노트북 등이 모두 객체입니다. 이들은 일부 특정 속성과 메소드를 가지고 있어 어떤 동작을 수행할 수 있습니다. 클래스란 무엇인가요? 클래스는 객체의 청사진을 정의합니다. 객체의 속성과 기능을 정의합니다. 예를 들어, 노트북은 클래스이고 당신의 노트북은 그것의 인스턴스입니다.

OOPS 개념

핵심 OOPS 개념은 다음과 같습니다:

  1. 추상화
  2. 캡슐화
  3. 다형성
  4. 상속
  5. 연관
  6. 집합
  7. 구성

자바 프로그래밍 언어를 사용하여 코드 예제를 제공하여 Java에서 OOPS 개념을 어떻게 구현하는지 알 수 있도록 객체 지향 프로그래밍 개념을 하나씩 살펴 보겠습니다.

1. 추상화

추상화는 내부 세부 사항을 숨기고 간단한 용어로 설명하는 개념입니다. 예를 들어, 두 정수를 더하는 메서드입니다. 메서드의 내부 처리는 외부 세계에서 숨겨집니다. 객체 지향 프로그래밍에서 추상화를 달성하는 여러 가지 방법이 있습니다. 캡슐화 및 상속 등이 있습니다. 자바 프로그램도 추상화의 좋은 예입니다. 여기서 자바는 간단한 문장을 기계어로 변환하고 내부 구현 세부 사항을 외부 세계에 숨깁니다.

추가 읽기: OOPS에서 추상화란?

2. 캡슐화

캡슐화는 객체지향 프로그래밍에서 추상화를 구현하는 기술입니다. 캡슐화는 클래스 멤버 및 메서드에 대한 액세스 제한에 사용됩니다. 액세스 수정자 키워드는 객체지향 프로그래밍에서 캡슐화에 사용됩니다. 예를 들어, 자바에서는 private, protected, 그리고 public 키워드를 사용하여 캡슐화를 구현할 수 있습니다.

3. 다형성

다형성은 객체가 다양한 상황에서 다르게 동작하는 개념입니다. 두 가지 유형의 다형성이 있습니다 – 컴파일 시 다형성과 실행 시 다형성. 컴파일 시 다형성은 메서드 오버로딩으로 구현됩니다. 예를 들어, 다음과 같은 클래스를 가질 수 있습니다.

public class Circle {

	public void draw(){
		System.out.println("Drwaing circle with default color Black and diameter 1 cm.");
	}
	
	public void draw(int diameter){
		System.out.println("Drwaing circle with default color Black and diameter"+diameter+" cm.");
	}
	
	public void draw(int diameter, String color){
		System.out.println("Drwaing circle with color"+color+" and diameter"+diameter+" cm.");
	}
}

여기에는 여러 draw 메서드가 있지만 동작이 다릅니다. 이것은 메서드 오버로딩의 사례입니다. 모든 메서드 이름이 같고 인수가 다르기 때문입니다. 여기서 컴파일러는 컴파일 시간에 호출할 메서드를 식별할 수 있으므로 컴파일 시간 다형성이라고 합니다. 런타임 다형성은 객체 간에 “IS-A” 관계가 있는 경우에 구현됩니다. 이것은 또한 메서드 오버라이딩이라고 불리며 서브 클래스가 런타임 다형성을 위해 슈퍼 클래스 메서드를 오버라이드해야 합니다. 슈퍼 클래스를 기준으로 작업하는 경우 실제 구현 클래스는 런타임에 결정됩니다. 컴파일러는 어떤 클래스 메서드가 호출될지 결정할 수 없습니다. 이 결정은 런타임에서 이루어지므로 런타임 다형성 또는 동적 메서드 디스패치라는 이름이 붙습니다.

package com.journaldev.test;

public interface Shape {

	public void draw();
}
package com.journaldev.test;

public class Circle implements Shape{

	@Override
	public void draw(){
		System.out.println("Drwaing circle");
	}

}
package com.journaldev.test;

public class Square implements Shape {

	@Override
	public void draw() {
		System.out.println("Drawing Square");
	}

}

Shape은 슈퍼 클래스이며 CircleSquare라는 두 개의 서브 클래스가 있습니다. 아래는 런타임 다형성의 예입니다.

Shape sh = new Circle();
sh.draw();

Shape sh1 = getShape(); //some third party logic to determine shape
sh1.draw();

위의 예에서, 자바 컴파일러는 런타임에서 사용될 Shape의 실제 구현 클래스를 알지 못합니다. 따라서 런타임 다형성입니다.

4. 상속

상속은 객체지향 프로그래밍의 개념으로, 하나의 객체가 다른 객체를 기반으로 하는 것을 말합니다. 상속은 코드 재사용의 메커니즘입니다. 상속되는 객체를 슈퍼클래스라고 하고, 슈퍼클래스를 상속하는 객체를 서브클래스라고 합니다. 우리는 자바에서 상속을 구현하기 위해 extends 키워드를 사용합니다. 아래는 자바에서 상속의 간단한 예시입니다.

package com.journaldev.java.examples1;

class SuperClassA {

	public void foo(){
		System.out.println("SuperClassA");
	}
	
}

class SubClassB extends SuperClassA{
		
	public void bar(){
		System.out.println("SubClassB");
	}
	
}

public class Test {
	public static void main(String args[]){
		SubClassB a = new SubClassB();
		
		a.foo();
		a.bar();
	}
}

5. 연관

연관은 객체 간의 관계를 정의하는 OOPS 개념입니다. 연관은 객체들 사이의 다중성을 정의합니다. 예를 들어, 선생님과 학생 객체가 있습니다. 선생님과 학생들 사이에는 일대다의 관계가 있습니다. 마찬가지로, 학생은 선생님 객체와 일대다의 관계를 가질 수 있습니다. 그러나 학생과 선생님 객체는 서로 독립적입니다.

집합

집합은 특별한 종류의 연관입니다. 집합에서는 객체들은 자체적인 생명주기를 가지지만 소유권이 존재합니다. 객체들 간에 “가지고 있다(HAS-A)”는 관계와 소유권이 있는 경우 집합의 경우입니다.

6. 구성

구성은 집합의 특수한 경우입니다. 구성은 집합의 더 제한적인 형태입니다. “HAS-A” 관계에서 포함된 객체가 자체적으로 존재할 수 없는 경우, 그것은 구성의 경우입니다. 예를 들어, 집에는 방이 있습니다. 여기서 방은 집 없이는 존재할 수 없습니다. 구성은 상속보다 우수하다고 말됩니다. 자세한 내용은 구성 vs 상속에서 확인하십시오.

추가 참고 자료: 자바에서의 구성

이것으로 객체 지향 프로그래밍(OOPS) 개념에 대한 간략한 소개를 마칩니다.

더 많은 자바 예제 프로그램은 GitHub 저장소에서 확인할 수 있습니다.

참고 자료: https://docs.oracle.com/javase/tutorial/java/concepts/

Source:
https://www.digitalocean.com/community/tutorials/oops-concepts-java-example