[Java]OOP 및 Interface
OOP?
객체지향 프로그래밍(Object Oriented Programming)은 컴퓨터 프로그래밍 패러다임중 하나.
프로그래밍에서 필요한 데이터들 = 상태(변수)/행위(메서드)를 추상화 시켜 정의해 놓고 실제 상태와 행위를 가진 객체를 만들고 그 객체들간의 유기적인 상호작용을 통해 로직을 구성하는 방법
장점
코드 재사용에 용이
남이 만든 클래스를 가져와서 이용할 수 있고 상속을 통해 확쟁해서 사용할 수 있음
유지보수가 쉬움
수정해야 할 부분이 클래스를 바탕으로 객체를 생성해 사용하기 때문에 해당 부분만 수정하면 됨
대형 프로젝트에 적합
클래스단위로 모듈화시켜 개발할 수 있으므로 대형 프로젝트처럼 여러명, 여러회사에서 개발이 필요할 시 업무분담이 쉬움
단점
처리속도가 상대적으로 느림, 설계시 많은 시간과 노력 필요
OOP의 키워드 5가지
- 클래스 + 인스턴스(객체)
- 추상화
- 캡슐화
- 상속
- 다형성
클래스와 인스턴스(객체)는 무엇인가요?
클래스 : 프로그래밍에서 필요한 상태(변수)와 행위(메서드)를 추상화 시켜 정의해 놓은 것
인스턴스(객체) : 클래스에서 정의한 것을 토대로 실제 메모리상에 할당된 것으로 실제 프로그래밍에서 사용되는 데이터
객체지향 프로그래밍에서 추상화(자료의 추상화)
공통의 속성이나 기능을 묶어 정의하는 것 (= 객체지향 관점에서 클래스를 정의하는 것)
캡슐화란 무엇인가요?
연관된 데이터와 함수를 논리적으로 묶어놓은 것, 데이터를 보호하기 위해 다른 객체의 접근을 제한하기도 합니다. (접근제한자. ex.private 등)
정보 은닉
공개된 정보만 접근 및 조작이 가능하여 객체가 실제 데이터의 처리 과정을 알 수 없다.
즉 외부에서 내부 데이터를 직접 접근할 수 없으며 조작할 수 없다. 접근하기 위해서는 특정 오퍼레이션(ex.setter 등)을 사용해야 한다. 따라서 데이터의 손상과 오류 발생의 최소화
상속은 무엇인가요?
상속은 부모클래스의 속성과 기능을 그대로 이어받아 사용할 수 있게하고 기능의 일부분을 변경해야 할 경우 상속받은 자식클래스에서 해당 기능만 다시 수정(정의)하여 사용할 수 있게 하는 것. 다중상속은 불가능하다.
(클래스의 상속 관계에서 혼란을 줄 수 있기 때문에 상속은 반드시 하나만 가능하고 필요에 따라 인터페이스를 사용할 수 있게 구현됨)
다형성은 무엇인가요?
하나의 변수명, 함수명 등이 상황에 따라 다른 의미로 해석될 수 있는 것.
즉 오버라이딩(Overriding), 오버로딩(Overloading)이 가능하다는 얘기.
오버라이딩 : 부모클래스의 메서드와 같은 이름, 매개변수를 재정의 하는것.
오버로딩 : 같은 이름의 함수를 여러개 정의하고, 매개변수의 타입과 개수를 다르게 하여 매개변수에 따라 다르게 호출할 수 있게 하는 것.
getter, setter를 사용하는 이유?
getter, setter를 사용하면 메서드를 통해서 접근하기 때문에, 메서드 안에서 매개변수같이 어떤 올바르지 않은 입력에 대해 사전에 처리할 수 있게 제한하거나 조절할 수 있기 때문.
(ex. setter에서 유효범위를 넘은 정수가 들어왔을 때의 처리를 하고나서 set하거나 예외처리를 해버릴 수 있는 것.
getter도 마찬가지로 굳이 예를들자면 자료에 무언가 더하거나 빼고 준다든지가 가능하다.)
Interface?
인터페이스란 추상화(abstract)를 더욱 추상화시킨것.
추상 클래스와 비슷한 것처럼 보이지만, 사용하는 목적이 다르기 때문에 특징을 명확히 구별할 수 있어야 한다.
인터페이스는, 이 인터페이스를 상속한 클래스들에게서 항상 같은 동작을 보장하기 위하여 사용한다. (ex. toString 등)
추상클래스는, 슈퍼클래스를 상속받았을 때 해당 클래스의 내용을 확장하려할 때 사용한다.
특징
다중 상속을 지원합니다. 추상클래스는 다중 상속이 불가.
인터페이스 구성물은 상수, 추상 메소드(껍데기만 있는 메소드)로 2종류만 존재합니다.(현재는 X)
-> JAVA 8이 등장하면서 interface에 대한 정의가 몇 가지 변경.
- default 메서드
인터페이스가 default 키워드로 선언되면 메소드가 구현될 수 있게 되었고, 또한 구현 클래스는 default 메서드를 오버라이딩 할 수 있습니다.public interface Calculator { public int plus(int i, int j); public int multiple(int i, int j); default int exec(int i, int j){ //default로 선언함으로 메서드를 구현할 수 있다. return i + j; } }
- static 메서드
인터페이스에 static 메소드 선언이 가능해졌고, 인터페이스를 이용하여 간단한 기능을 가지는 유틸리티성 인터페이스를 만들 수 있게 되었습니다. ``` java public interface Calculator { public int plus(int i, int j); public int multiple(int i, int j); default int exec(int i, int j){ return i + j; } public static int exec2(int i, int j){ //static 메서드 return i * j; } }
public class MyCalculatorExam { public static void main(String[] args){ Calculator cal = new MyCalculator(); int value = cal.exec(5, 10); System.out.println(value);
int value2 = Calculator.exec2(5, 10); //static 메서드 호출
System.out.println(value2);
} } ```
장점
- 개발시간 단축
- 표준화 가능
- 서로 관계없는 클래스들끼리 관계를 맺어줌
- 독립적인 프로그래밍 가능
- 개발시간 단축
인터페이스(틀)이 작성되면 이를 이용해 프로그램을 작성하는 것이 가능합니다.
메서드를 호출하는 쪽에서는 메서드의 내용에 관계없이 선언부만 알면 되기 때문입니다.- 표준화 가능
프로젝트에 사용되는 기본 틀을 인터페이스로 작성한 다음, 개발자들에게 인터페이스를 구현하여 작성하게 함으로써 일관되고 정형화된 프로그램 개발이 가능합니다.- 서로 관계없는 클래스들끼리 관계를 맺어줌
서로 상속관계에 있지 않은 아무 관계없는 클래스들에게 하나의 인터페이스를 공통적으로 구현하도록 함으로써 관계를 맺어줍니다.- 독립적인 프로그래밍 가능
인터페이스를 이용하면 클래스의 ‘선언’과 ‘구현’을 분리 시킬 수 있습니다.
실제구현에 독립적인 프로그램을 작성하는 것이 가능합니다.
클래스와 클래스간의 직접적인 관계를 인터페이스를 이용해서 간접적인 관계로 변경하면, 한 클래스의 변경이 관련된 다른 클래스에 영향을 미치지 않는 독립적인 프로그래밍이 가능합니다.