공부 기록

[Java] Java와 객체 지향 프로그래밍 본문

프로그래밍/Java

[Java] Java와 객체 지향 프로그래밍

I'm_ 2024. 1. 2. 23:28

들어가며

Java는 객체 지향 프로그래밍 언어이다.
여기서 객체 지향 프로그래밍(Object Oriented Programming)이란 부품을 조립하여 완성품을 만들듯이 객체를 먼저 만들고 이 객체들을 조립하여 완성된 프로그램을 만드는 기법이다.
객체 지향 프로그래밍의 특징으로는 추상화, 상속, 캡슐화, 다형성이 있다.
그동안 Java를 공부하며 객체 지향의 특징에 대해 제대로 공부한 적이 없었는데 오늘 이 4가지 특징을 정리하는 시간을 가졌다.


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

추상화

추상의 사전적 의미는 여러 가지 사물이나 개념에서 공통되는 특성이나 속성 따위를 추출하여 파악하는 작용을 말한다.(출처: 네이버 사전)
자바의 추상 클래스는 실체 클래스들의 공통적인 필드나 메서드를 추출해서 선언한 클래스로 실체 클래스의 부모 역할을 한다.

  • 추상 클래스는 new 연산자를 사용하여 객체를 직접 생성할 수 없고, 실체 클래스의 부모 클래스로만 사용된다.
  • 추상 메소드는 실행 내용을 가지지 않으며, 자식 클래스에서 재정의 하여 내용을 작성한다.
//추상 클래스
public abstract class Animal{
    //추상 메소드
    public abstract void sound();
}

public class Cat extends Animal{
    //추상 메소드 재정의
    @Override
    public void sound(){
        System.out.println("야옹");
    }
}


상속

하위(자식) 객체가 상위(부모) 객체의 필드와 메서드를 물려받아 사용할 수 있다.

  • 상속을 통해 중복된 부분을 없애 코드의 재사용성을 높인다.
  • 부모 객체의 필드와 메서드를 수정하면 상속받은 모든 자식 객체들은 수정된 필드와 메서드를 사용할 수 있어 유지 보수 시간이 절약된다.
//부모 클래스
public class Animal{
    //필드
    public String type;

    //메소드
    public void eat(){
        System.out.println("먹는다");
    }
}

public class Bird extends Animal{
    public void sound(){
        System.out.println("짹짹");
    }
}

public class Main{
    public static void main(String[] args){
        Bird bird = new Bird();

        bird.eat(); //먹는다 --> 상속받은 메소드 
        bird.sound(); //짹짹 
    }
}


캡슐화

캡슐화란 객체의 필드와 메소드를 하나로 묶고 실제 구현 내용을 외부에 감추는 것을 말한다.

  • 캡슐화된 객체는 필드와 메소드가 외부로 노출되지 않아 객체를 보호할 수 있다.
  • 이때, 접근제한자를 이용하여 외부에 객체를 숨길지 노출시킬지 결정한다.
접근 제한자 제한 대상 제한 내용
public 클래스, 필드, 생성자, 메소드 없음
protected 필드, 생성자, 메소드 같은 패키지 혹은 자식 객체만 사용 가능
(default) 클래스, 필드, 생성자, 메소드 같은 패키지
private 필드, 생성자, 메소드 객체 내부


다형성

다형성은 사용방법은 동일하지만 실행 결과가 다양하게 나오는 성질로 자동 타입 변환과 메서드 오버라이딩을 통해 나타나는 특징이다.

  • 자동 타입 변환 : 부모 타입의 변수에 자식 타입을 대입할 수 있다.
Animal animal = new Bird();
  • 메소드 오버라이딩 : 상속된 메서드를 자식 클래스에서 재정의하는 것을 말하며, 메서드가 오버라이딩 되었다면 자식 메서드가 우선적으로 사용된다.
public class Animal{
    public void sound(){
        System.out.println("동물 소리");
    }
}

public class Cat extends Animal{
    @Override
    public void sound(){
        System.out.println("야옹");
    }
}

public class Dog extends Animal{
    @Override
    public void sound(){
        System.out.println("멍멍");
    }
}


자식 클래스가 부모 클래스를 상속받고 동일 메소드를 오버라이딩하고 있다면 메서드 호출 시 결과는 다르게 나오는데 이를 다형성이라 할 수 있다.

Animal animal = new Animal();
Animal cat = new Cat();
Animal dog = new Dog();

animal.sound(); //동물 소리
cat.sound(); //야옹
dog.sound(); //멍멍


나가며

기본서에는 객체 지향의 4가지 특징을 나누어 정리하지 않고 클래스, 상속, 인터페이스라는 챕터에 각 내용이 녹아져 설명되어 있다.

각 특징에 알아야 할 자세한 내용들이 많지만 간단하게라도 적어보는 것이 내용을 정리하는데 도움이 많이 되었다.

부족한 내용들은 앞으로 공부해가며 조금씩 채워가야겠다.


참고자료

  • 이것이 자바다 (신용권, 임경균 지음)