JAVA 공부 - [1] 객체지향 프로그래밍 (OOP)

Soondol·2025년 1월 8일

객체지향 프로그래밍 (OOP)

  • 프로그램을 "객체" 라는 독립적인 단위로 구성하여 개발하는 방법
  • 주요 개념으로는 클래스, 객체, 상속, 다형성, 캡슐화가 있다.

클래스

  • 객체를 만들기 위한 설계도
  • 속성(변수)과 동작(메소드)을 정의
	public class Car {
    	String model;
        String color;
        
        void drive() {
        	System.out.println("driving car");
        }
    }

객체

  • 클래스를 기반으로 생성된 실체(instance)
  • 클래스에서 정의된 속성과 메소드를 가짐
	Car myCar = new Car();
    myCar.model = "Kia";
    myCar.color = "blue";
    myCar.drive();  // "driving car" 출력
    

상속

  • 기존 클래스(부모 or 슈퍼 클래스)의 속성과 메소드를 새로운 클래스(자식 or 서브 클래스)가 물려받음
  • 코드 재사용성과 계층 구조를 만들 수 있음
  • 자식 클래스는 부모 클래스의 모든 속성, 메소드를 사용할 수 있으며, 필요한 경우 이를 오버라이드(재정의) 하여 수정할 수 있음
	public class ElectricCar extends Car {
    	int batteryCapacity;
        
        void charge() {
        	System.out.println("charging car");
        }
    }
    
    ElectricCar myElectricCar = new ElectricCar();
    myElectricCar.model = "tesla";
    myElectricCar.color = "white";
    myElectricCar.batteryCapacity = "500";
    myElectricCar.drive(); // "driving car"
    myElectricCar.charge(); // "charging car"

다형성

  • 동일한 메소드가 다양한 형태로 동작할 수 있는 능력
  • 메소드 오버로딩, 메소드 오버라이딩

메소드 오버로딩

  • 같은 이름의 메소드를 매개변수의 타입, 개수에 따라 다르게 정의
	public class MathUtils {
    	int add(int a, int b) {
        	return a + b;
        }
        
        double add(double a, double b) {
        	return a + b;
        }
    }

메소드 오버라이딩

  • 자식 클래스에서 부모 클래스의 메소드를 재정의
	public class car {
    	void drive() {
        	System.out.println("driving car");
        }
    }
    
    public class ElectricCar extends Car {
        @Override
        void drive() {
            System.out.println("driving electric car");
        }
    }

캡슐화

  • 객체의 속성과 메소드를 하나의 단위로 묶고, 외부에서 접근할 수 없도록 보호하는 원칙
  • 캡슐화를 통해 데이터의 무결성을 유지하고 코드의 유연성을 높임
  • 일반적으로 접근 제어자 (public, private, protected)를 사용하여 클래스의 변수와 베소드를 보호
    public class Account {
        private double balance;

        public void deposit(double amount) {
            if (amount > 0) {
                balance += amount;
            }
        }

        public double getBalance() {
            return balance;
        }
    }

추상화

  • 복잡한 시스템을 단순화하여 필요한 부분만 드러내는 개념
  • 추상 클래스와 인터페이스를 사용하여 객체의 구체적인 구현을 숨기고, 외부에서 필요한 기능만 사용할 수 있도록 함

추상 클래스

    abstract class Animal {
        abstract void makeSound(); // 추상 메소드

        void eat() { // 일반 메소드
            System.out.println("This animal eats food.");
        }
    }

    class Dog extends Animal {
        @Override
        void makeSound() {
            System.out.println("Bark");
        }
    }

    class Cat extends Animal {
        @Override
        void makeSound() {
            System.out.println("Meow");
        }
    }
  • Animal 클래스는 추상 클래스, makeSound()라는 추상 메소드를 정의
  • Dog와 Cat 클래스는 Animal 클래스를 상속받아 makeSound() 메소드를 구현
  • eat() 메소드는 일반 메소드로, 모든 동물의 공통된 행동을 정의

인터페이스

    interface Vehicle {
        void start(); // 추상 메소드
        void stop();  // 추상 메소드
    }

    class Car implements Vehicle {
        @Override
        public void start() {
            System.out.println("Car is starting.");
        }

        @Override
        public void stop() {
            System.out.println("Car is stopping.");
        }
    }

    class Bike implements Vehicle {
        @Override
        public void start() {
            System.out.println("Bike is starting.");
        }

        @Override
        public void stop() {
            System.out.println("Bike is stopping.");
        }
    }
  • Vehicle 인터페이스는 start()와 stop()이라는 두 개의 추상 메소드를 정의
  • Car와 Bike 클래스는 Vehicle 인터페이스를 구현하여 각각의 시작 및 정지 동작을 정의

객체지향 프로그래밍을 왜 알아야하는가?

1. 자바의 특성

  • 자바는 객체지향 언어로 설계되었기 때문에 OOP개념을 이해하고 활용해야함

2. 코드 재사용성

  • 상속과 다형성을 통해 기존 코드를 재사용, 이를 통해 개발자는 중복된 코드를 줄이고, 유지보수성을 높일 수 있음

3. 유지보수성

  • 코드를 모듈화하여 각 객체가 독립적으로 동작하도록 설계. 이렇게 하면 코드 변경이 필요할 때 특정 객체만 수정하면 되므로, 전체 시스템에 미치는 영향을 최소화함

4. 확장성

  • 새로운 기능을 추가할 때 기존 클래스를 수정하지 않고도 새로운 클래스를 만들어 확장

5. 추상화

  • 복잡한 시스템을 단순화하여 필요한 부분만 드러내는 추상화 개념을 제공

6. 데이터 은닉

  • 캡슐화를 통해 객체의 내부 상태를 보호하고, 외부에서 직접 접근하지 못하게 할 수 있음. 이를 통해 데이터의 무결성을 유지하고, 의도하지 않은 방식으로 데이터가 변경되는 것을 방지

0개의 댓글