객체지향 프로그래밍 (
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를 통해 수행.
。클래스의필드,메소드는 각각instance와static요소가 존재.
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안에 관련된Data와Method를 포함 및 외부에서 해당Class의객체참조 시Data를 오직Method를 통해 참조하도록 하는 것.
▶ 생성한객체의속성을 함부로 변경하지 않기 위해서캡슐화를 수행
。객체의데이터를접근한정자(Access Modifier)의private로 설정하여 숨기고 Method( =Getter)를public으로 설정하여 해당Method로만데이터에 접근하도록 제한.
ex) 자동차의 속도, 방향 같은 데이터는private로서 외부객체가 이용할 수 없고, 가속페달, 운전대 같은Method는pulibc으로서 외부객체가 이용 가능.
추상화(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
。부모Class의instance를 지칭하는 변수.
▶자식 Class에서부모 Class의Member(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:Class가Abstract 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 Class의instance를 생성하지 않아도Static Nested Class의instance만 따로 생성하여 사용 가능
。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 Class의private를 포함한 모든멤버변수에 접근가능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(); } }
Class의Method종류
。Method의 이름은 보통 동사를 사용
생성자: (Contructor) :접근제한자 Class명(매개변수)
。Class의Instance가 생성 시 자동으로 호출되어Instance의 변수를 초기화하는Method.
▶ 주로Class의instance생성 시 매개변수를 전달 받아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은인스턴스에 속하지 않으므로인터페이스 객체를 생성하지않아도 호출될 수 있음
▶Class의Static 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에서 정의된field와Method에 대한 데이터를 지님
。new키워드를 활용하여객체를 생성하며 해당 키워드 사용 시Heap영역 내부에 공간을 할당.
▶ 모든객체는Heap 영역내부에 저장된다.
▶Class와Object관계
final키워드 :
。변수,method,class에 선언하여 활용
final 변수:
。객체참조변수,변수에 선언하며 한번 값이 할당 될 경우 그 이후에재할당을 금지
▶상수와 의미가 유사
。객체참조변수에 선언 시참조대상객체의주소가 고정되어있으므로할당이 불가능하지만,객체내부 값은 변경가능
。final을 통해변수에불변속성을 부여할 수 있으나, 일부자료구조 객체(Map,Set등 )의 경우 보장이 안되므로자료구조객체.of(값)을 통해불변성을 보장하는객체를 생성
상수와 차이점?
。final 변수: 각클래스 객체에서인스턴스 변수로서메모리 할당되어Heap 영역에 저장
▶객체생성시점부터프로그램 수명주기동안메모리 할당
。상수(static final) : 유일한클래스 변수로서Static 영역에서 저장
▶Compile Time부터프로그램 수명주기동안메모리 할당
final 메소드:
。선언된메소드를자식클래스에서메소드 오버라이드할 수 없도록 설정.
ex )템플릿 메소드 패턴에서템플릿메소드를자식클래스에서메소드 오버라이딩을 방지하기위해 사용
final 클래스
。 더 이상자식클래스를 가질 수 없는Class
▶ 해당클래스를 다른클래스에서상속할 수 없도록 설정