ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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

    댓글

Designed by Tistory.