웹사이트 검색

Java의 OOPS 개념 - OOPS 개념 예제


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

객체 지향 프로그래밍 모델이란 무엇입니까?

개체 지향 프로그래밍 모델은 개체 개념을 중심으로 합니다. 객체란 무엇입니까? 개체는 클래스의 인스턴스입니다. 여기에는 속성과 기능이 포함되어 있습니다. 실제 개체와 같습니다. 예를 들어 자동차, 집, 노트북 등은 모두 객체입니다. 특정 작업을 수행하기 위한 몇 가지 특정 속성과 메서드가 있습니다. 수업이란 무엇입니까? 클래스는 개체의 청사진을 정의합니다. 개체의 속성과 기능을 정의합니다. 예를 들어 랩탑은 클래스이고 랩탑은 클래스의 인스턴스입니다.

OOPS 개념

  1. 추상화
  2. 캡슐화
  3. 다형성
  4. 상속
  5. 협회
  6. 집계
  7. 구성

이러한 객체 지향 프로그래밍 개념을 하나씩 살펴보겠습니다. Java에서 OOPS 개념을 구현하는 방법을 알 수 있도록 코드 예제에 Java 프로그래밍 언어를 사용합니다.

1. 추상화

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

더 읽을 거리: OOPS에서 추상화란 무엇입니까?

2. 캡슐화

캡슐화는 객체 지향 프로그래밍에서 추상화를 구현하는 데 사용되는 기술입니다. 캡슐화는 클래스 멤버 및 메서드에 대한 액세스 제한에 사용됩니다. 액세스 한정자 키워드는 객체 지향 프로그래밍에서 캡슐화에 사용됩니다. 예를 들어 자바의 캡슐화는 private, protectedpublic 키워드를 사용하여 이루어집니다.

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();

위의 예에서 Java 컴파일러는 런타임에 사용될 Shape의 실제 구현 클래스를 모르기 때문에 런타임 다형성을 알 수 없습니다.

4. 상속

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

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\ 관계에 포함된 개체가 자체적으로 존재할 수 없는 경우 구성의 경우입니다. 예를 들어 House에는 방이 있습니다. 여기에서 방은 집 없이 존재할 수 없습니다. 구성을 말합니다. 상속보다 낫다면 Composition vs Inheritance에서 자세히 읽어보세요.

더 읽을 거리: Java의 구성

이것이 OOPS 개념에 대한 빠른 정리를 위한 전부입니다.

GitHub 리포지토리에서 더 많은 Java 예제 프로그램을 살펴볼 수 있습니다.

참조: https://docs.oracle.com/javase/tutorial/java/concepts/