JAVA - 객체지향 프로그래밍( OOP )

TopOfTheHead·2025년 7월 26일

자바 ( JAVA )

목록 보기
29/29

객체지향 프로그래밍 ( OOP : Object-Oriented Programming ) :
프로그램을 여러개의 객체( Object )으로 분할 및 구성하여, 해당 객체들이 서로 상호작용하여 동작하는 방식의 프로그래밍 패러다임
프로그램의 데이터 및 데이터에 접근하는 코드를 클래스 단위로 모듈화하여 각 클래스끼리 상호작용을 수행
클래스는 여러 프로그램에서 재사용하는것도 가능해져 효율성 증대

절차적 프로그래밍를 개선한 방식

ex ) Python , C++ , Java , C# , JavaScript.. etc

。 실제 세계에 존재하는 객체 ( Object )를 프로그램 상에서 추상화하여 표현.
▶ 실세계의 객체상태 ( state )와 행위 ( behavior )을 프로그램상에서 객체로서 variable , method로 표현.

。기존 절차적 프로그래밍의 경우 단순한 프로그램의 경우는 문제 없지만, 소프트웨어 위기를 통한 소프트웨어의 규모가 증대되고, 복잡해져 절차적 프로그래밍을 수행 시 대규모 소프트웨어의 유지보수를 원활하게 수행하기가 어려워짐.
객체지향 프로그래밍을 통해 프로그램을 다수의 객체로 구현하여 서로 상호작용하도록 구현

  • 절차적 프로그래밍 ( Procedural Programming )
    프로그램 전체를 유기적으로 연결되도록하는 프로그래밍 패러다임으로서 순차적 처리를 지향
    객체지향 프로그래밍프로그램클래스 단위로 모듈화하여 각 클래스끼리 상호작용을 수행

    。컴퓨터 처리구조와 유사해 실행속도가 빠르다.

    프로그램의 규모가 커질수록 유지보수가 어렵고 , 가독성이 떨어진다.
    대규모 프로젝트에 부적합.

  • 소프트웨어 위기 ( Software Crisis )
    SW기술의 발전에 비해 급격한 HW기술의 발전으로 인하여 사용자의 요구사항이 다양해지면서 해결할 문제가 더욱 복잡해졌으나, 이를 충족하지 못하는 현상.

패키지 ( Package ) , 모듈 ( Module )
SW의 전체 구조를 표현하기 위해 관련된 응집도 높은 클래스집합을 하나의 논리적단위로 묶는 구성요소
▶ 내부의 클래스들을 감춤으로써 시스템구조를 추상화하여 단순

Class : Conceptualization ( 개념화 )
객체지향 패러다임에서 가장 기초가 되는 개념으로서 프로그램을 구성하는 코드단위

설계도 개념으로서 실세계의 객체상태 ( state )와 행위 ( behavior )프로그램상에서 객체로서 variable , method로 표현.
Design Abstraction에 대응.

속성 : 고유정보 / 상태정보로 구성
고유정보 : 클래스 고유 상태로서 변하지 않음.
상태정보 : 동적으로 변하는 상태

Class의 이름은 보통 명사를 사용.

Object를 정의하는 형틀(template)로서 속성(Data)와 동작(Method)를 포함하여 재사용성과 유지보수성을 증진.
인스턴스화( Instantiate ) : Class를 통해 객체를 생성하는 행위

Class단일 상속만 가능.
다중 상속Interface를 통해 수행.

클래스필드 , 메소드는 각각 instancestatic 요소가 존재.

  • Method
    클래스행위에 해당하는 클래스함수

    。 일반적인 함수와는 다른 개념
    클래스함수 = 메서드 / 독립적으로 존재하여 기능한 경우 함수

  • 클래스 관계
    • is-a 관계
      클래스상속관계를 지시
      자식클래스 is-a 부모클래스

      is-a 관계의 경우 상속으로 표현하여 상속관계를 설정

      UML Class Diagram에서는 부모-자식 관계를 화살표를 사용하여 다음처럼 표현.
      자식 Class → 부모 Class 방향으로 지시

    • has-a 관계
      클래스포함관계를 지시
      ▶ 한 객체가 다른 객체에 속하는 포함관계 인 경우
      고수준클래스 has-a 저수준클래스

      has-a 관계 인 경우 한 클래스( ex. Car ) 내부에서 다른 클래스( Engine )의 객체를 멤버 변수로 포함하여 구성관계를 설정
      ex ) car has-a engine


  • 설계추상화 ( Design Abstraction ) : 복잡한 시스템을 단순화하고 조직화하여 핵심적인 요소만 남기고 불필요한 세부 사항을 숨기는 설계 방식

  • 인스턴스 : instance , 정적 : static
    Instance Method / Instance Field :
    클래스 객체 생성 시 함께 생성되어 Heap 영역을 차지
    ▶ 각 클래스 객체마다 독립

    클래스 객체에서 호출

    Static Method / Static Field
    클래스 당 유일하게 존재하며 Static 영억을 차지
    ▶ 동일 클래스의 다른 객체를 생성하더라도 동일한 static 요소를 참조

    클래스 자체에서 호출

    static :
    。선언된 데이터메모리 할당컴파일 시점에서 수행할 것을 의미
    프로그램 수명주기동안 메모리 수명 유지

객체지향 프로그래밍( OOP ) 4가지 특징
클래스의 4가지 특징으로도 간주 가능.

캡슐화 , 추상화 , 상속 , 다형성

  • 캡슐화 ( Encapsulation ) :
    클래스객체변수 또는 Method캡슐로 감싸서 안보이게 하는 정보은닉 개념
    ▶ 최소한의 정보만 외부에 노출

    캡슐화높은 응집도낮은 결합도를 유지

    。하나의 Class 안에 관련된 DataMethod를 포함 및 외부에서 해당 Class객체 참조 시 Data를 오직 Method를 통해 참조하도록 하는 것.
    ▶ 생성한 객체속성을 함부로 변경하지 않기 위해서 캡슐화를 수행

    객체데이터접근한정자 ( Access Modifier )private로 설정하여 숨기고 Method( = Getter )를 public으로 설정하여 해당 Method로만 데이터에 접근하도록 제한.
    ex) 자동차의 속도, 방향 같은 데이터는 private로서 외부객체가 이용할 수 없고, 가속페달, 운전대 같은 Methodpulibc으로서 외부객체가 이용 가능.

  • 추상화 ( Abstraction ) :
    。어떤 주요 세부사항을 명확하게 이해하기 위해 중요하지 않은 절차 또는 물체를 의도적으로 생략하여 복잡도를 감소하는 방법
    불필요한 부분을 무시하여 현실에 존재하는 복잡도를 극복

    일반화(Generalization)는 추상화를 위한 도구

    추상화 방법 : abstract class, interface

    클래스 정의 시 불필요한 정보는 생략하고 속성 중 필요한 정보만 중점을 두어 개략화하여 핵심만 표현
    • 제어 추상화 ( Control Abstraction )
      제어 흐름저수준 세부사항을 숨기고 고수준제어구조만 노출하는 것
      ▶ 사용자가 특정 Method를 사용 시 Method 내부의 Logic을 자세히 모르더라도 호출하는 방법과 어떤 결과를 도출하는지 알기만하면 되는 것을 의미

      ex ) Arrays.sort()를 사용 시 내부의 로직을 이해할 필요 없이 단순히 매개변수배열을 전달하여 해당 배열이 정렬이 수행되는것만 알면 되는 것

    • 데이터 추상화( Data Abstraction )
      대상을 보다 간단한 개념으로 일반화하는 과정을 의미
      ▶ 복잡한 데이터 구조일반화하여 간단하고 이해하기 쉬운 형태로 변환하는 과정

      ex ) 갤럭시폰휴대폰통신기기데이터 추상화를 수행


  • 상속 ( Inheritance ) :
    。특정 클래스가 가진 속성 ( Member Variable, Method )을 다른 클래스에게 부모 - 자식 관계로 상속하는 것을 의미
    ▶ 특정 Class의 속성을 Code-Reuse하여 다른 Class에게 간결하고 효과적으로 구현 및 기능을 확장.

    。서로 다른 클래스를 하나의 공통된 카테고리로 묶을 수 있음
    인터페이스 , 추상클래스의 경우 해당 범주가 되는것을 목적으로 한다.

    Java에서는 자식 extends 부모()를 통해 부모 Class의 속성을 상속.

    Class단일 상속만 가능.
    다중 상속Interface를 통해 수행.

    。기능 확장 시 is-a 관계로서 상속을 수행하며 has-a 관계 일때는 상속을 수행하지 않는다
    has-a 관계 인 경우 한 클래스( ex. Car )에서 다른 클래스( Engine )의 객체를 멤버 변수로 포함하여 구성관계를 설정
    ex ) car has-a engine

    。부모로부터 상속받은 attribute에 더해서 추가적으로 attribute를 선언 가능.
    abstract를 통해 부모로부터 상속받을 attribute들 중 불필요한 attribute를 숨길수 있다.
    부모클래스변수를 참조 시 부모클래스 변수private가 아닌 protected 접근제한자로 선언하여 자식클래스에서 접근가능하도록 설정
    • 부모 : ( Parent = Super Class = ancestor )
      일반화 : Generalization :
      객체들의 공통적인 특징을 추출해서 정의하고 필요없는 기능을 제거하여 하나의 묶음으로 정의하는 과정

    • 자식 : ( Child = Sub Class = descendant )
      。구체화 : Specialization

    • self
      。특정 instance의 자신을 지칭하는 변수.

    • super
      。부모 Classinstance를 지칭하는 변수.
      자식 Class에서 부모 ClassMember( Field, Method, Constructor )를 가져올 때 활용됨.

      super(생성자매개변수) : 자식 Class에서 부모 Class의 생성자를 호출 시 사용하는 함수
      super.메소드명() : 부모 Class의 Method를 호출
      super.변수명 : 부모 Class의 변수를 호출.


  • 다형성 ( Polymorphism ) :
    。동일한 데이터 타입 / 인터페이스에 대해 여러 가지 데이터 타입 유형객체를 처리할 수 있는 능력
    ▶ 동일한 메서드에 대해서 매개변수로 입력된 객체 Type에 따라 서로 다른 동작을 수행하는 것 ( 메서드 오버로딩 )

    부모 Class에서 정의된 Method자식 Class에서 상속한 동일 이름의 Method에서 기능을 재정의하여 활용이 가능함( 메서드 오버라이딩 )을 의미.
    부모 Class Method를 상속한 자식 Class동일 Method메소드 오버라이딩을 통해 다양한 용도로 실행될 수 있으므로 붙여진 이름.

    다형성을 활용 시 부모 Class에서는 Method를 상속할 자식 Class에 구애받지 않고도 코드를 임의로 작성할 수 있는 장점이 존재.
    자식클래스에서 메서드 오버라이딩을 통해 재정의가 가능하므로

    。또한 상속할 자식 Class에서는 상속한 Method재정의함으로써 구체적으로 명시하여 사용이 가능하므로 결합도가 낮은 유연한 프로그램 구축 시 도움이된다.
    • 메소드 오버라이딩 ( Method Overriding ) :
      부모 Class에서 정의된 Method를 자식 Class에서 재정의( override ) 하는것을 의미.
      메서드 내용만 수정하며 반환자 / 메서드명 / 매개변수 등을 수정 시 그저 함수 하나 생성하는 것.

    • 메소드 오버로딩 ( Method Overloading )
      。각각의 매개변수, 반환자 등 이 다른 동일명칭의 메소드를 여러개로 정의

Class 종류

  • 추상 클래스 ( Abstract Class )
    。특정 클래스들을 묶어 카테고리 역할을 수행하는 클래스
    인터페이스와 유사한 역할을 수행
    ▶ 단 인터페이스와의 차이점은 단일상속 , 다른 위계구조를 가지면 카테고리를 묶을 수 없으며 내부에 변수를 선언가능하고 메소드의 세부동작을 지정가능한 특징을 가짐

    。상속할 수 있는 상위 Class의 역할로서만 기능하며 객체를 직접 생성 불가능하고 오직 업캐스팅으로 생성가능
    동물 같은 경우 카테고리로서, 자신의 객체가 존재하지 않지만, 이 특징을 상속하는 구체화진돗개객체가 존재

    Abstract Method : ClassAbstract Method를 한개라도 포함하고 있으면, 반드시 Abstract Class로 선언되어야하며, Abstract Method가 정의되있는 경우, Abstract Class를 상속한 Class는 반드시 해당 Abstract Method를 구현해야한다.

  • Sealed Class :
    Abstract Class와 반대의 개념으로서, 더이상 상속을 할 수 없도록 선언한 최종 Class.
    자식 Class를 더 이상 가질 수 없다.

    Sealed Method : 더 이상 Override를 수행하지 못하도록 선언된 Method.

  • final Class :
    。접근제한자 final을 붙여서 선언한 Class로서 더 이상 자식클래스를 가질 수 없는 Class
    ▶ 해당 클래스를 다른 클래스에서 상속할 수 없도록 설정

  • 중첩 클래스 ( Nested Class )
    Class 또는 Interface 내부에서 선언한 클래스

    。감싸고 있는 Outer Class멤버변수에 접근 시 유용함.
    Outer Class에서 선언된 캡슐화멤버변수중첩클래스를 통해 다른 외부 클래스로 전달하는 용도로 종종 사용

    Nested Class 종류

    • Static Nested Class
      static으로 선언된 중첩 클래스
      Outer Classinstance를 생성하지 않아도 Static Nested Classinstance만 따로 생성하여 사용 가능

      Static Nested Class 기준 Outer Class에서 static으로 선언된 멤버변수Static Nested Class에서 접근가능
    class Outer {
        static class StaticNested {
            void display() {
                System.out.println("정적 중첩 클래스");
            }
        }
    }
    // 사용
    Outer.StaticNested sn = new Outer.StaticNested();
    sn.display();
            .
    • 내부 클래스 ( Inner Class )
      static을 선언하지 않은 중첩클래스
      ▶ 다른 클래스에서 Outer Class의 instance를 선언 후 해당 Inner Class의 instance를 생성하여 사용

      Innr Class 기준 Outer Classprivate를 포함한 모든 멤버변수에 접근가능
    class Outer {
        int outerValue = 10;
        class Inner {
            void show() {
                System.out.println("외부 값: " + outerValue);
            }
        }
    }
    // 사용
    Outer outer = new Outer();
    Outer.Inner inner = outer.new Inner();
    inner.show();
              .
    • 지역 클래스 ( Local Inner Class )
      지역변수처럼 Method 내부에 선언되는 클래스
      Method 실행 중에만 사용가능
     class Outer {
        void outerMethod() {
            class LocalInner {
                void msg() {
                    System.out.println("지역 내부 클래스");
                }
            }
            LocalInner local = new LocalInner();
            local.msg();
        }
    }

ClassMethod 종류
Method의 이름은 보통 동사를 사용

  • 생성자 : ( Contructor ) : 접근제한자 Class명(매개변수)
    ClassInstance가 생성 시 자동으로 호출되어 Instance의 변수를 초기화하는 Method.
    ▶ 주로 Classinstance 생성 시 매개변수를 전달 받아 Member Variable의 초기값을 지정 시 활용됨.

    Source Code에서 명시적으로 호출이 불가능.
    。반환값을 가질 수 없으며 Class 이름과 동일한 이름을 사용.

  • 소멸자 : ( Destructor ) :
    Runtime 시 자동으로 호출되어 사용하지 않는 Instance를 파괴하는 역할의 Method.
    ▶ 더 이상 사용되지 않는 객체메모리Heap 영역을 계속 차지하고 있다면 메모리공간이 부족해지므로, 이를 Garbage Collector에 의해 자동으로 Garbage Collection하여 점유하던 메모리를 사용가능하도록 설정.

인터페이스 ( Interface ) :
추상클래스와 유사한 용도로 특정 클래스들을 묶어 카테고리 역할을 수행
추상클래스와 달리 서로 완전히 다른 부모 클래스에 속해 위계구조가 다른 클래스도 하나의 카테고리로 묶을 수 있다.
▶ 또한 여러 클래스에 대해 다중상속을 수행할 수 있다.

추상클래스와 동일하게 그 자체로 객체를 생성하지 못하나, 인터페이스를 구현한 클래스 객체를 통해 객체를 생성할 수 있음.
객체를 직접 생성 불가능하고 오직 업캐스팅으로 생성가능
ex ) Queue<Integer> q = new LinkedList<Integer>();

복수 이상의 Class에 대해 공통기능을 구현하는 용도로서 해당 공통기능Interface에 구현하여 복수 이상의 서로 다른 Class에 상속하여 공통적인 기능을 지닐 수 있도록 구현하는 용도로 설계.
위계구조상 서로 연관이 없는 Class 간의 공통적인 성질을 정의할 필요가 있을때 해당 성질이 구현된 Interface를 동일하게 상속

Bird , Airplane , Super-man은 서로 다른 부모를 가짐으로써 위계구조를 가지는 클래스이지만, 공통적으로 하늘을 비행하는 특징이 존재하므로, 해당 특징을 구현한 Interface를 상속하여 공통적으로 구현.

Interface구현 메소드만을 포함하며 Interface를 상속 시 Interface 내부의 메소드를 모두 구현해야한다.

Interface는 명명규칙으로서 관습적으로 대문자 I로 시작.
C# 기준

Class단일상속만 가능하므로, Interface를 통해 여러 Class에 대해 다중상속을 수행한다.
▶ 서로 다른 계보를 가지는 Object에게 공통성질을 부여하여 하나의 카테고리로 분류를 수행 시 효과적

정보은닉성 ( Infromation Hiding ) : 외부객체에 대해 고수준Interface를 통해 어떻게 이용할 수 있는정도만 알려주고, 저수준의 세부 내부로직은 숨기는 성질을 의미

  • 인터페이스다중상속을 지원하는 이유
    클래스 단일상속의 이유는 다이아몬드 문제로서, 동일한 메서드 시그니처를 지닌 메서드를 가진 부모에게 상속 받으면 ambiguous가 발생하는 문제가 존재

    인터페이스 다중상속의 경우도 결국 ambiguous가 발생하지만, 그러나 구현이 된 인터페이스 메서드를 우선적으로 참조하므로, 문제가 크게 발생하지 않는다.

  • 인터페이스 / 추상클래스객체를 만들 수 없는 이유?
    추상메서드실행 로직을 정의할 수 없으므로 new를 통해 인터페이스 또는 추상클래스구현체를 생성할 수 없다.
    ▶ 이때, 익명클래스를 통해 추상메서드실행 로직을 정의하는 경우 인터페이스 객체를 직접 생성할 수 있음.
 @FunctionalInterface
 public interface Ainterface{
 	void a(); // 추상메서드   
 }
 //
Ainterface concrete = new Ainterface(
 	@Override
    public void a(){
    	// 실행로직
    }
 );

▶ 다음처럼 new를 통해서 interface 구현체를 직접 생성할 수 있음,

 Ainterface concrete = () -> {
    // 실행로직 
 };

람다 표현식으로 축약해서 구현할 수 있음

인터페이스에서 구현가능한 Method
JAVA 8에서는 구현메소드뿐만 아닌 static , default 키워드가 붙은 메소드도 구현가능

  • Default Method
    。기존 인터페이스를 구현하는 클래스인터페이스구현메소드를 모두 강제로 구현해야하는 문제가 존재하여 메소드를 함부로 정의할 수 없다.
    인터페이스 분리원칙( ISP )에 위배

    Java 8에서 등장한 암시적 public method로서 인터페이스를 구현하는 클래스는 해당 default method를 구현하지 않아도 되는 특징이 존재
    ISP를 준수하면서 default method를 통해 인터페이스에 자유롭게 메소드를 추가가능

    Default Method는 주로 JPA에서 활용

    default method구현클래스 객체를 생성 후 업캐스팅을 통해 인터페이스 구현체 도출 시 default method를 호출하여 사용할 수 있음
interface IFunctional{
	default String unit(){
		return "디폴트메서드 호출";
	}
}
class dummy implements IFunctional { }
public class Main {
	public static void main(String[] args) {
        // 업캐스팅하여 인터페이스 구현체 생성
		IFunctional functional = new dummy();		
		 // default method 호출
        System.out.println(functional.unit());
	}
}
  • JPA에서 Default Method 활용사례
    。특정 DB와 상호작용하는 긴 네이밍을 가진 메소드를 간단하게 축약해서 대리로 호출하는 용도로 활용

    。또한 해당 외부에 노출되지않도록 캡슐화하는 역할을 수행

    interface IFunctional{
    	int getIDJPAfromDBusingJPA();
    	default void getID(){
    		// 외부에서 getID()를 호출 시 내부에서 getIDJPAfromDBusingJPA()를 대신호출
    		getIDJPAfromDBusingJPA();
    	}
    }


  • Static Method
    static인스턴스에 속하지 않으므로 인터페이스 객체를 생성하지않아도 호출될 수 있음
    ClassStatic Method와 개념적으로 거의 동일
interface IFunctional{
	static int add(int a , int b){
		return a + b;
	}
}
public class Main {
	public static void main(String[] args) {
		System.out.println(IFunctional.add(3,4)); // 7 도출
	}
}

객체 ( Object = Instance ) : Realization ( 실제화 )
Class를 기반으로 인스턴스화 ( Instantiate )하여 생성된 객체.
Class에서 정의된 fieldMethod에 대한 데이터를 지님

new 키워드를 활용하여 객체를 생성하며 해당 키워드 사용 시 Heap 영역 내부에 공간을 할당.
▶ 모든 객체Heap 영역 내부에 저장된다.



ClassObject 관계

final 키워드 :
변수 , method , class에 선언하여 활용

  • final 변수 :
    객체참조변수 , 변수에 선언하며 한번 값이 할당 될 경우 그 이후에 재할당을 금지
    상수와 의미가 유사

    객체참조변수에 선언 시 참조대상객체주소가 고정되어있으므로 할당이 불가능하지만, 객체 내부 값은 변경가능

    final을 통해 변수불변속성을 부여할 수 있으나, 일부 자료구조 객체( Map , Set 등 )의 경우 보장이 안되므로 자료구조객체.of(값)을 통해 불변성을 보장하는 객체를 생성
    • 상수와 차이점?
      final 변수 : 각 클래스 객체에서 인스턴스 변수로서 메모리 할당되어 Heap 영역에 저장
      객체생성시점부터 프로그램 수명주기 동안 메모리 할당

      상수 ( static final ) : 유일한 클래스 변수로서 Static 영역에서 저장
      Compile Time부터 프로그램 수명주기 동안 메모리 할당


  • final 메소드 :
    。선언된 메소드자식클래스에서 메소드 오버라이드 할 수 없도록 설정.
    ex ) 템플릿 메소드 패턴에서 템플릿메소드자식클래스에서 메소드 오버라이딩을 방지하기위해 사용

  • final 클래스
    。 더 이상 자식클래스를 가질 수 없는 Class
    ▶ 해당 클래스를 다른 클래스에서 상속할 수 없도록 설정
profile
공부기록 블로그

0개의 댓글