이끌든지 따르든지 비키든지

Software Development/Java

[JAVA] 객체지향과 자바

SeongHo5 2023. 9. 12. 16:07

 

객체 지향 프로그래밍(Object Oriented Programming)이란 현실 세계의 객체(Object)를 모델링하고 이러한 객체들 간의 상호 작용을 통해 소프트웨어를 개발하는 방법론을 말한다.

 

객체 지향 프로그래밍에는 크게 4가지 특징과 5가지 원칙(SOLID 원칙)이 있는데, 이 중 특징과 이에 대한 Java에서의 구현에 대해 알아본다.

 


캡슐화(Encapsulation)

캡슐화란, 서로 관련 있는 정보나 데이터, 이를 처리하기 위한 기능을 한 곳에 모아 관리하고, 필요한 부분만을 외부로 노출하는 것을 말한다.

 

캡슐에 담긴 데이터에 대한 직접적인 접근은 허용하지 않고, 대신 이를 확인하거나, 수정할 수 있는 인터페이스를 구현해 이를 통해서만, 데이터에 접근할 수 있도록 하는 정보 은닉이 캡슐화의 핵심 원리 중 하나이다.

 

Java에서는 접근제어자(public, private, protected, default)를 통해 캡슐화를 구현한다.

 

	private int num1;
	private int num2;
	
	public int getNum1() {
		return num1;
	}
	
	public void setNum1(int num1) {
		this.num1 = num1;
	}
	
	public int getNum2() {
		return num2;
	}
	
	public void setNum2(int num2) {
		this.num2 = num2;
	}

위 코드는 캡슐화를 간단히 구현한 예시이다. num1, num2 변수는 private 멤버 변수로 선언되어, 외부 클래스에서 변수(데이터)에 직접 접근할 수 없다. 대신, getNum / setNum 메소드를 통해 외부에서 변수에 접근하거나, 이를 수정할 수 있다.


 

추상화(Abstraction)

추상화란, 여러 객체가 공통적으로 가지는, 핵심적인 속성과 기능 등을 추상화하여 정의하는것을 말한다.

 

Java에서는 추상 클래스, 인터페이스 등을 통해 추상화를 구현한다.

public abstract class Shape {
    // abstract 키워드로 선언
    public abstract double getArea();
    public abstract double getPerimeter();
}

public class Circle extends Shape {
    private double radius;

    public Circle(double radius) {
        this.radius = radius;
    }

    @Override
    public double getArea() {
        return Math.PI * radius * radius;
    }

    @Override
    public double getPerimeter() {
        return 2 * Math.PI * radius;
    }
}

추상 클래스, 추상 메서드 모두 abstract 키워드를 사용해 선언할 수 있지만,

모든 추상 클래스가 반드시 추상 메서드를 가져야하는 것은 아니고 메서드를 가지지 않아도 괜찮다.

그러나 추상 메서드를 가진 추상 클래스를 상속받은 클래스는 그 메서드의 구현이 강제된다.

 


상속(Inheritance)

상속은 하나의 클래스가 다른 클래스의 속성과 메서드를 가져와 재사용하는 것을 말한다.

이때 속성이나 메서드를 전달하는(물려주는) 클래스를 부모 클래스(또는 상위 클래스), 이를 전달받는 클래스를 하위 클래스(또는 자식 클래스)라고 부른다.

 

상속은 객체 지향 언어에서 코드 재사용과 계층적 구조 생성에 매우 중요한 역할을 하기 때문에 꼭 알아둬야하는 개념이다.

// 부모 클래스
class Animal {
    void eat() {
        System.out.println("동물이 밥을 먹는다.");
    }
}

// 자식 클래스
class Dog extends Animal {
    void bark() {
        System.out.println("개는 멍멍");
    }
}

public class Main {
    public static void main(String[] args) {
        Dog myDog = new Dog();
        myDog.eat(); // 상속된 메서드 호출
        myDog.bark(); // 자체 메서드 호출
    }
}

Animal 클래스를 상속받은 Dog 클래스는 자체 메서드인 bark()와 부모 클래스의 메서드인 eat()를 모두 사용할 수 있다.

 

Java에서는 단일 상속만 지원하므로 하나의 클래스는 하나의 부모 클래스만을 가진다.

그러나 다중 상속이 반드시 필요한 경우, 인터페이스를 통해 다중 상속의 효과를 얻을 수 있다.


다형성(Polymorphism)

다형성은 떤 객체의 속성이나 기능이 상황에 따라 여러 가지 형태를 가질 수 있는 성질을 말하는데,

자바는 메소드 오버로딩(Overloading)과 메소드 오버라이딩(Overriding) 이 두 가지 방식으로 다형성을 구현한다.