1. OOP
Object Oriented Programming
객체지향 언어의 특징
OOP is APIE
Abstraction(추상화): 현실의 개념을 프로그램 상의 객체로 간추려서 표현
Polymorphism(다형성)
Inheritance(상속)
Encapsulation(데이터 은닉과 보호):
연관있는 데이터와 행위를 하나로 묶는 것(변수와 메서드 활용)
외부 객체에 구현 내용을 숨기는 것(접근제한자 활용)
다형성(polymorphism)
- 객체가 관점, 상황에 따라 여러 다양한 역할을 할 수 있게 되는 것.
- 하나의 참조변수로 여러 타입의 객체를 참조할 수 있는 것.
- 여러가지 형태를 가질 수 있는 능력.
-> 조상타입의 참조변수로 자손타입의 객체를 다룰 수 있음.
ex) 학생은 사람이면서 동물.
-> 상속, 추상클래스, 인터페이스(구현)
장점(Pros)
유연한 프로그램을 만들 수 있음.
-
부모 객체와 상호작용하는 프로그램을 만들면 자식 객체와도 상호작용이 가능.
-
자식 객체 종류 늘어나도 기존 코드의 수정 최소화 가능(유지보수 용이).
abstract class Animal{
abstract void cry(){
}
} //추상클래스
class Mouse extends Animal{}
class Cat extends Animal{}
public static class Main{
public static void main(){
Animal animal = new Mouse();
animal.cry();
인터페이스와 추상클래스
추상클래스
하나 이상의 추상 메서드를 포함하고 있는 클래스.
추상메서드
메서드의 선언(이름, 매개변수, 반환타입 정의)만 되어있는 메서드.
메서드의 구체적인 내용은 구현하지 않아도 되며, 이를 구현하는 클래스에서 내용을 정의함.
추상클래스(Abstract Class)
특징
- 인스턴스 생성 불가: 추상클래스는 인스턴스를 직접 생성할 수 없으며, 이를 상속받은 하위 클래스가 인스턴스를 생성할 수 있음. 이는 추상클래스가 기본적으로 미완성된 클래스이기 때문임.
- 일부 메서드는 구현 가능, 일부는 선언만 가능: 추상클래스는 일부 메서드는 구현할 수 있고, 일부 메서드는 선언만 할 수 있음. 이는 하위 클래스가 반드시 구현해야 하는 메서드를 강제할 수 있게 함. 예를 들어, 공통적인 동작은 추상클래스에서 구현하고, 구체적인 동작은 하위 클래스에서 구현하도록 함.
- 단일 상속만 가능: 자바에서는 추상클래스는 단일 상속만 가능함. 즉, 한 클래스가 하나의 추상클래스만 상속받을 수 있음. 이는 다중 상속으로 인해 발생할 수 있는 복잡성을 피하기 위함임.
- 인스턴스 변수, 상수 모두 선언 가능: 추상클래스는 인스턴스 변수와 상수를 모두 선언할 수 있음. 이는 공통적인 속성을 정의하고, 이를 하위 클래스에서 활용할 수 있게 하기 위함임.
- 접근 제어자 사용 가능: 추상클래스의 메서드와 변수는 접근 제어자를 사용할 수 있음. 이는 필요한 경우 접근 범위를 조절하여 캡슐화를 할 수 있게 함.
- 사용 목적: 추상클래스는 공통적인 속성과 메서드를 가지며, 추상 메서드를 통해 하위 클래스가 구체적인 구현을 하도록 강제함. 이는 코드의 재사용성을 높이고, 일관성을 유지하는 데 도움을 줌.
- 키워드:
abstract 키워드를 사용하여 추상클래스를 정의함. 이 키워드는 클래스나 메서드를 추상적으로 선언할 때 사용되며, 하위 클래스에서 이를 상속받아 구현함.
인터페이스(Interface)
용어 설명
- 구현체: 인터페이스를 구현하는 클래스. 인터페이스에 선언된 모든 메서드를 구현해야 함.
- 상위개념: 인터페이스는 상위개념으로 사용되며, 다양한 클래스들이 공통으로 구현해야 할 메서드를 정의함.
- 인터페이스: 서로 다른 장치를 연결하는 규격. 클래스가 구현해야 할 메서드를 선언함.
- 추상체: 객체들의 부모 역할 수행. 인터페이스는 여러 클래스들이 공통적으로 구현해야 하는 추상체 역할을 하며, 직접 인스턴스를 생성하지 않고 이를 구현하는 클래스에 의해 사용됨.
- 추상 메서드: 인터페이스 내의 메서드는 모두 추상 메서드로 선언됨. 구현 클래스가 이를 구현함.
- 키워드: interface 키워드를 사용하여 인터페이스를 정의하며, 이를 구현하는 클래스는 implements 키워드를 사용함.
특징
- 인스턴스 생성 불가: 인터페이스는 직접 인스턴스를 생성할 수 없으며, 오직 다른 클래스가 이를 구현하도록 하는 규격을 제공함.
- 메서드 선언만 가능, 구현 불가: 인터페이스 내부에서는 메서드의 선언만 할 수 있으며, 메서드의 구현은 이를 구현하는 클래스에서 이루어짐. 이는 해당 메서드를 사용하는 클래스가 구체적인 동작 방식을 자유롭게 정의할 수 있게 함.
- 다중 구현 가능: 자바에서 인터페이스는 다중 구현이 가능함. 즉, 한 클래스가 여러 인터페이스를 구현할 수 있으며, 이는 코드의 유연성을 높여줌. 예를 들어, 한 클래스가 여러 인터페이스를 구현함으로써 다양한 기능을 제공할 수 있음.
- 상수만 선언 가능: 인터페이스 내에서는 변수 선언이 불가능하며, 오직 상수(final 변수)만 선언할 수 있음. 이는 인터페이스의 역할이 행동 규약을 정의하는 것에 중점을 두기 때문임.
- 모든 메서드는 기본적으로 public, 접근 제어자 사용 불가: 인터페이스의 메서드는 기본적으로 public이며, 다른 접근 제어자를 사용할 수 없음. 이는 인터페이스가 외부에 공개된 명세서 역할을 하기 때문임.
- 사용 목적: 인터페이스는 서로 다른 클래스가 공통으로 가져야 할 메서드의 선언을 정의하는 데 사용됨. 이는 다양한 클래스가 동일한 방식으로 동작하게 하여 일관성을 유지하게 함.
- 키워드:
interface 키워드를 사용하여 인터페이스를 정의함. 이 키워드는 자바에서 인터페이스를 선언할 때 사용되며, 클래스가 인터페이스를 구현할 때는 implements 키워드를 사용함.
인터페이스 & 추상클래스 비교
인터페이스: 서로 다른 장치를 연결하는 규격
인스턴스를 생성할 수 없지만 클래스가 구현해야할 메서드를 정의함.

Object를 포함한 설명
Java에서 모든 클래스는 기본적으로 Object 클래스를 상속받습니다. 이는 모든 클래스가 Object 클래스의 메서드들을 기본적으로 가지고 있다는 것을 의미합니다. Person 클래스와 이를 상속받는 Student 클래스를 예로 들어, Object, Person, Student 간의 관계를 설명해보겠습니다.
즉, 모든 객체의 최고 조상은 Object
(Object는 toString 있음)
ex)
Person 클래스와 Student 클래스의 관계
- Person: 부모 클래스, 기본적인 사람의 속성과 행동을 정의합니다.
- Student: 자식 클래스, Person 클래스를 상속받아 학생의 추가적인 속성과 행동을 정의합니다.
ex) InstanceOf 연산자를 이용
Person p1 = new Person();
Student s1 = new Student();
if Student extends Person
if (p1 instanceof Person){
sysout(p1 + "is an instance of Person.")
if (p1 instanceof Student){
sysout(p1 + "is an instance of Student.")
if (s1 instanceof Person){
sysout(p1 + "is an instance of Person.")
if (s1 instanceof Student){
sysout(p1 + "is an instance of Student.")
T F
p1은 Person 클래스의 인스턴스입니다.
p1은 Student 클래스의 인스턴스가 아닙니다.
T T
s1은 Student 클래스의 인스턴스입니다.
s1은 Person 클래스의 인스턴스이기도 합니다(상속 관계).