-
Java - 객체지향언어Language/Java 2021. 12. 7. 14:46
객체지향언어의 정의
객체(Object)란?
- 객체란 세상에 존재하는 모든 것을 의미한다. 즉, 주변에 있는 사물이나 생명체 같은 모든 것들을 말한다.
- 프로그래밍에서의 객체는 데이터의 분산을 막기 위해 데이터와 기능을 하나로 묶은 그룹이라고 할 수 있다.
객체지향언어(Object Oriented Langauge)란?
- 컴퓨터 프로그래밍의 한 가지 기법으로, 객체를 만들고 객체를 사용하는 프로그래밍 방법을 말한다.
- 프로그램을 그저 데이터와 처리방법으로 나누는 게 아닌, 상태와 행위를 가진 객체들을 만들고, 이러한 객체들을 레고 블록처럼 서로 상호작용 하도록 조립해서 하나의 프로그램을 만드는 것을 의미한다.
객체지향언어의 특징
캡슐화(Encapsulation)
public class Person { private int age; public Person(int age) { this.age = age; } public int getAge() { return age; } }
- 캡슐화는 객체에 필요한 데이터나 기능(메서드)을 책임이 있는 객체에 그룹화시켜주는 것을 말한다.
- 위에 코드가 캡슐화의 예이며, Person 클래스는 Person과 관련된 데이터와 기능을 모아둔 클래스이다.
상속(Inheritance)
- 하위 클래스가 상위 클래스의 모든 정보를 물려받는 것을 의미한다.
- 상속이 필요한 이유는 여러 객체에서 사용되는 기능을 하나의 클래스로 분리해서 사용할 수 있도록 하기 위함이다. 즉, 중복되는 코드의 재사용성을 위해서 상속이 사용된다.
class Person { String name; int age; Person(String name, int age) { this.name = name; this.age = age; } }
class Student extends Person { int score; Student(String name, int age, int score) { super(name, age); this.score = score; } } class Teacher extends Person { String subject; Teacher(String name, int age, int subject) { super(name, age); this.subject = subject; } }
- 위 코드와 같이, 중복되는 데이터나 기능을 상위 클래스로 분리하여 상속을 이용하면 재사용이 가능하다.
다형성(Polymorphism)
- 상속과 연관이 있는 개념으로 한 객체가 다른 여러 형태로 재구성되는 것을 말한다.
- 쉽게 말하면, 하나의 부모의 밑에서 태어난 자식이 똑같지 않다는 것을 의미한다.
- Java의 오버로드(Overload) 또는 오버라이드(Override)가 다형성의 대표적인 예라 할 수 있다.
public class Fruit { String name; int price; int fresh; public void show() { System.out.println("이름 : " + this.name + ", " + "가격 : " + this.price + ", " + " 신선도 : " + this.fresh); } }
- 부모 클래스인 Fruit 클래스는 name, price, fresh 속성을 지니고 있으며, 해당 정보를 출력해주는 show( ) 메서드를 가지고 있다.
public class Peach extends Fruit { public Peach() { price = 1500; name = "복숭아"; fresh = 75; } } public class Banana extends Fruit { public Banana() { price = 1000; name = "바나나"; fresh = 85; } }
- 자식 클래스인 Peach, Banana 클래스는 부모 클래스인 Fruit를 상속받고 있으며, 각각 다른 정보로 초기화된다.
public class Main { public static void main(String[] args) { Fruit fruit = new Peach(); // "가격 : 1500, 이름 : 복숭아, 신선도 : 75" 출력 fruit.show(); fruit = new Banana(); // "가격 : 1000, 이름 : 바나나, 신선도 : 85" 출력 fruit.show(); } }
- 이처럼, 같은 자료형(Fruit)에 여러 가지 객체(Peach, Banana)를 대입하여 다양한 결과를 얻어내는 성질을 다형성이라고 한다.
- 하나의 타입으로 다양한 실행 결과를 얻을 수 있기 때문에, 객체를 부품 화하여 유지 보수를 용이하게 한다는 장점이 있다.
추상화(Abstraction)
- 추상화는 실제 세상을 객체화하는 것이 아니라, 필요한 정보만을 중심으로 간소화하는 것을 의미한다.
- 프로그래밍 언어에서는 객체들의 공통적인 속성과 기능을 중심으로 추상화한다.
abstract class Vehicle { protected int speed; public void setSpeed(int speed) { this.speed = speed; } abstract void show(); // 추상 메서드 }
- 위 코드는 추상 메서드를 포함하는 추상 클래스이다.
- 추상 메서드는 선언 부만 있고, 구현부가 없는 메서드를 의미하며, 이런 추상 메서드를 포함하는 클래스를 추상 클래스라고 한다.
class Car extends Vehicle { private int number; private double gas; public Car(int number, double gas, int speed) { super(speed); this.number = number; this.gas = gas; } public void show() { // 추상 메서드 오버라이딩 System.out.println("차량 번호는 " + number + "입니다."); System.out.println("연료 양은 " + gas + "입니다."); System.out.println("속도는 " + speed + "입니다."); } } class Plane extends Vehicle { private int flight; public Plane(int flight, int speed) { super(speed); this.flight = filght; } public void show() { // 추상 메서드 오버라이딩 System.out.println("비행기 번호는 " + filght + "입니다."); System.out.println("속도는 " + speed + "입니다."); } }
- 추상 클래스는 미완성 클래스이기 때문에, 객체를 생성할 수 없다. 따라서, 위 코드와 같이 반드시 상속관계를 통해서만 사용할 수 있다.
- 추상 클래스(Vehicle)를 상속받은 클래스(Car, Plane)는 추상 메서드(show( ))를 오버라이딩 해야한다.
객체지향언어의 장점
재사용성
- 상속을 통해 프로그래밍 코드의 재사용성을 높일 수 있다.
생산성 향상
- 잘 설계된 클래스를 만들어서 독립적인 객체를 사용함으로써 개발의 생산성을 향상시킬 수 있다.
자연적인 모델링
- 우리 일상생활 모습의 구조가 객체에 자연스럽게 녹아들어 있기 때문에 생각하고 있는 것을 그대로 자연스럽게 구현할 수 있다.
유지보수의 우수성
- 프로그램의 특정 부분을 수정하더라도 캡슐화를 통해 주변 영향이 적기 때문에, 유지보수가 쉬워서 경제적이라고 할 수 있다.
객체지향언어의 단점
개발 속도 지연
- 객체가 처리하려는 것에 대한 정확한 이해가 필요하기 때문에, 설계 단계에서 많은 시간이 소요된다.
실행 속도 지연
- 객체의 수가 증가함에 따라 프로그램의 용량이 커지고 실행 속도가 느려진다는 단점이 있다.
728x90'Language > Java' 카테고리의 다른 글
Java - Primitive Type & Reference Type (0) 2022.02.19 Java - 인터페이스 (0) 2021.12.08 Java - 가비지 컬렉션(Garbage Collection) (0) 2021.11.15 Java - 자바 가상 머신(Java Virtual Machine) (0) 2021.11.09 Java - 컴파일 과정 (0) 2021.10.29