객체 지향 프로그래밍의 특징(java)

Java는 객체지향언어의 가장 대표적인 언어이다. 대표적 특징은 아래와 같다.

  • 캡슐화
  • 추상화
  • 다형성
  • 상속성

하나씩 살펴보자.


캡슐화

캡슐화란?

  • 하나의 객체에 대해 그 객체가 특정한 목적을 위한 필요한 변수나 메소드를 하나로 묶는 것을 의미
  • 클래스를 만들 때 만들어진 객체가 특정한 목적을 잘 수행할 수 있도록, 변수와 메서드를 관련성 있게 클래스에 구성해야 한다.


정보은닉

  • 캡슐화를 하는 중요한 목적은 정보은닉
  • 유저 정보를 가지고 있는 User 라는 객체가 public으로 선언되어 있다면 누구든 접근해서 유저 정보를 변경 가능하다. private 으로 해서 데이터를 보호, 접근 제한이 필요하다.
  • private으로 보호된 변수는 getter나 setter 등의 메서드를 통해서만 간접적으로 접근이 가능하도록 하는것이 캡슐화의 중요한 목적이다.
  • 즉, 사용자의 입장에서는 public 으로 정의된 속성만 알면 된다는 의미


추상화

세상에 모든 것을 다 클래스에 담고 객체를 만드는 것은 매우 비효율 적이다. 최소한 공통적인 요소나 필수적인 요소는 들어갔으면 하는 바램에서 만든 것이 추상 클래스이다.

예로, 벤츠, 아우디, 티코 등 우리가 생각하는 여러 종류의 자동차가 있다. 이것을 다 클래스화 하고 변수와 메서드를 개별적으로 만드는 것은 무모한 짓이다.

따라서 방금 나열한 자동차들의 공통요소나 특징을 추출하는 과정인 추상화를 거쳐 요소를 끄집어 내면 바퀴, 핸들, 차문, 유리창 등 필수적인 부품이 있다.

바퀴는 굴러가고, 핸들은 돌아가고, 차문은 열려야 한다는 공통적 행동들이 메서드가 된다.

이러한 과정이 추상화 하는 과정이다.

다시 정리하면 객체들은 실제 그 모습이지만, 클래스는 객체들이 어떤 특징들이 있어야 한다고 정의하는 추상화된 개념이다.

추상화 : 객체들의 공통된 특징을 파악해 정의해 놓은 설계 기법


다형성

형태가 같은데 다른 기능을 하는 것을 의미한다.(같은 동작 다른 결과물)

이를 통해 코드가의 재사용, 코드길이 감소가 되어 유지보수가 용이하도록 도와준다.

Overriding & Overloading

  • Overriding
    • 부모클래스의 메서드를 자식클래스에서 재정의해서 사용
  • Overloading
    • 같은 이름의 메서드를 다른용도로 사용할 수 있도록 구현
    • 메서드끼리 이름은 같지만 매개변수의 갯수 혹은 데이터 타입이 달라야 한다.
// Overriding

public class Employee{
  
  public String name;
  public int age;
  
  public void print(){
    System.out.println("사원의 이름 = "+this.name+", 나이 = "+this.age);
  }
}

//Emplyee 상속
public class Manager extends Employee{
  
  String jobOfManage;
  
  //overriding  Employee의 pirnt() 메소드 오버라이딩
  public void print(){
    System.out.println("사원의 이름 = "+this.name+", 나이 = "+this.age);
    System.out.println("관리자 "+this.name+"은 "+this.jobOfManage+" 담당입니다.");
  }
}

//Overloading
public class OverloadingTest{
  
  public void test(){
    System.out.println("사용자 없음");
  }
  
  public void test(String name){
    System.out.println("사용자 이름 = " +name);
  }
  
  public void test(String name, int money){
    System.out.println("사용자 이름 = "+name+" , 사용료 = "+money);
  }
}


상속성

객체지향의 꽃이다.

  • 부모 클래스의 기능을 가져와 재사용할 수 있으면서도 동시에 새롭게 만든 클래스에 새로운 기능을 추가할 수 있게 만들어 준다.

inheritance

상자 하나하나는 모두 객체이고, 자바 용어로는 Class이다.

하위 객체는 상위 객체의 특징을 물려받는다.

상속에 관련된 부분인 접근 제어자부터 집고 넘어가자.

접근제어자

public protected default private
All 상속 or 동일 패키지 상속 and 동일 패키지 클래스 내부

상속 받았다고 모든 경우에 다 사용할 수 있는 것은 아니다. 위와 같이 접근제어자에 따라 달라질 수 있다.

상속 받는 방법은 대표적으로 extends와 implements 두가지 방법이 있다.


extends

상속의 대표적인 형태이다.

부모의 메소드를 그대로 사용할 수 있으며, 오버라이딩 할 필요 없이 부모에 구현되어있는 것을 직접 사용 가능하다.

class Vehicle {
  protected int speed = 3;
  
  public int getSpeed(){
    return speed;
  }
  public void setSpeed(int speed){
    this.speed = speed;
  }
}

class Car extends Vehicle{
  public void printspd(){
    System.out.println(speed);
  }
}

public class ExtendsSample {
  public static main (String[] args){
    Car A = new Car();
    System.out.println(A.getSpeed());
    A.printspd();
  }
}


implements

예부터 보자.

interface TestInterface{
  public static int num = 8;
  public void fun1();
  public void fun2();
}

class InterfaceExam implements TestInterface{
  @Override
  public void fun1(){
    System.out.println(num);
  }
  
  @Override
  public void fun2() {
    
  }
}

public class InterfaceSample{
  public static void main(String args[]){
    InterfaceExam exam = new InterfaceExam();
    exam.fun1();
  }
}

implements의 가장 큰 특징은 부모의 메소드를 반드시 Overriding(재정의) 해야한다.

부모 객체는 선언만 하며 내용은 자식에서 오버라이딩해서 사용해야 한다는 것이다.

위 코드를 보면 알수 있듯이, class가 interface를 사용할 때 implements를 써야 한다.

정리하자면 extends는 클래스를 확장하는 것이고, implements는 인터페이스를 구현하는 것이다.

인터페이스를 상속받는 클래스에서 인터페이스에 정의된 메소드를 구현하면 된다.


참조 사이트

Tags:

Categories:

Updated:

Leave a comment