티스토리 뷰

자바

객체지향이란?

tioon 2023. 5. 8. 03:01

 

객체지향 프로그래밍이란?

- 객체를 중심으로 코드를 작성하는 방법입니다. 객체는 데이터와 메소드 (데이터 조작하는 함수)로 이루어져 있으며, 각 객체는 서로 독립적으로 작동합니다. 객체는 클래스라는 틀을 기반으로 만들어지며, 이 객체들 간의 상호작용을 통해 프로그램을 설계하고 개발하는것 입니다. 예를들어 주변에 존재하는 모든사물 (꽃,자동차,핸드폰) , 생명체 (사람,강아지)등이 다 객체로 표현 될 수 있습니다.

 

위의 예시를 보시면 두개의 객체가 있습니다. 하나는 person 객체 ,나머지 하나는 car객체.
객체가 클래스 기반으로 만들어져있어 person객체는 3개의 데이터와 3개의 메소드를 가지고 있으며
car객체는 3개의 데이터와 4개의 메소드를 가지고 있습니다.

 

 

객체지향 프로그래밍 의 장점
  1. 재사용성 증가
    -상속을 통해 기존의 클래스를 재사용하거나 확장을 할 수 있기에 재사용성이 증가합니다.
  2. 유지보수 용이
    -객체 단위로 나누기 때문에 코드의 수정이나 추가를 할때 전체 코드를 수정할 필요가 없어 용이합니다.
  3. 확장성 증가
    -새로운 클래스를 추가하거나 상속을 통해 수정함으로 프로그램의 기능을 확장성이 높아집니다.
  4. 코드 가독성 증가
    -객체의 속성과 동작이 코드에 명시되기 때문에 코드를 이해하기 쉬워집니다.

 

객체지향 프로그래밍의 단점
  1. 실행속도 느림
    -객체지향 프로그래밍은 상호작용이 많기 때문에 절차지향 프로그래밍보다 상대적으로 속도가 느립니다.
  2. 설계시간 증가
    -설계 단계에서 객체간의 관계를 잘 분석하고 설계해야 하므로 설계가 복잡해져 시간이 오래걸립니다.

 

 

 

 

객체지향 프로그래밍 특징
  • 캡슐화(Encapsulation) 
    -데이터와 해당 데이터를 다루는 메소드를 하나의 캡슐처럼 묶어서 객체를 생성합니다. 이렇게 하여 데이터를 외부에서 직접 접근하는것을 막을 수 있고 객체간의 상호작용을 보다 안전하게 할 수 있습니다. 캡슐화를 사용하여 데이터 보호, 데이터 은닉의 효과를 얻을 수 있습니다.
public class Student {
    private String name;
    private int studentID;
    private String department;   // 외부에서 직접적인 접근불가
    
    public void setName(String name) {
        this.name = name;
    }
    
    public String getName() {
        return name;
    }
    
    public void setStudentID(int studentID) {
        this.studentID = studentID;
    }
    
    public int getStudentID() {
        return studentID;
    }
    
    public void setDepartment(String department) {
        this.department = department;
    }
    
    public String getDepartment() {    //getter 와 setter로 데이터 접근가능
        return department;
    }
}

 

  • 상속(Inheritance)
    -기존의 클래스를 재사용하여 새로운 클래스를 만드는 개념입니다. 상속을 통해 클래스간의 공통적인 코드를 재사용할 수 있으며, 코드의 중복을 방지할 수 있습니다. 즉 ,상위클래스로부터 확장된 여러개의 하위 클래스들이 모두 상위 클래스의 속성과 기능을 간편하게 사용할 수 있도록합니다.
class Animal { //상위 클래스
  String name;
  int age;

  public Animal(String name, int age) {
    this.name = name;
    this.age = age;
  }

  public void introduce() {
    System.out.println("이름: " + name + ", 나이: " + age);
  }
}



class Cat extends Animal { //하위 클래스, Animal을 상속받음   모든 멤버 변수와 멤버함수를 가져옴
  String breed;

  public Cat(String name, int age, String breed) { //상속자는 상속받지않음.
    super(name, age); // 부모 클래스의 생성자 호출
    this.breed = breed;
  }

  public void meow() {
    System.out.println("야옹");
  }

  @Override
  public void introduce() { //가져온걸 Override로 멤버 함수 변경
    System.out.println("이름: " + name + ", 나이: " + age + ", 종: " + breed);
  }
}

 

 

  • 추상화(Abstraction)
    -복잡한 시스템을 단순화 시켜 모델링하는것입니다. 추상화를 통해 시스템을 보다 이해하기 쉽게만들고 객체 간의 관계를 분석할 수 있습니다. 즉,여러 객체들의 공통적인 특징을 추출하여 정의하는 것을 의미합니다.
public abstract class Animal { //abstract 로 동물들의 공통적인 변수, 함수들을 정의  
    private String name;
    private int age;
    
   //추상 클래스는 인스턴스를 생성할 수 없으며, 상속을 통해 자식 클래스에서 구현되어야 합니다.
    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
    }

    //추상 메서드는 모든 하위 클래스가  꼭가져야하며 오버라이딩을 통해 클래스 특성에 맞게 구현되어야함
    public abstract void makeSound();
}

 

  • 다형성(Polymorphism)
    -객체지향 프로그래밍에서 하나의 메서드나 클래스가 있을때 이것이 다양한 방법으로 동작할 수 있는것을 말합니다. 즉, 어떤 객체의 속성이나 기능이 상황에 따라 여러가지 형태를 가질 수 있는 성질을 의미합니다.
class Animal { //상위 클래스
    public void makeSound() {
        System.out.println("동물소리");
    }
}

class Dog extends Animal {// 하위 클래스
    public void makeSound() {
        System.out.println("멍멍");
    }
}

class Cat extends Animal { //하위 클래스
    public void makeSound() {
        System.out.println("야옹");
    }
}

class Bird extends Animal {// 하위 클래스
    public void makeSound() {
        System.out.println("짹짹");
    }
}

public class PolymorphismExample {
    public static void main(String[] args) {
        Animal animal1 = new Dog(); 
        Animal animal2 = new Cat(); 
        Animal animal3 = new Bird(); 

        animal1.makeSound(); //Dog의 makesound() 실행
        animal2.makeSound(); //Cat의 makesound() 실행
        animal3.makeSound(); //Bird의 makesound() 실행
    }
}

 

 

 

 

 

 

 

 

 

 

 

오버로딩(Overloading)과 오버라이딩(Overriding)의 차이

 

  • 오버로딩
    -메소드나 생성자를 정의할 때 같은 이름의 메소드나 생성자를 여러개 정의하는 것을 말합니다. 오버로딩된 것은 서로 다른 매개변수를 받아들일 수 있으며, 호출시 전달된 인자를 기반으로 어떤 메소드나 생성자를 호출할지 결정합니다.
public int add(int x, int y) {
    return x + y;
}

public double add(double x, double y) {
    return x + y;
}

public int add(int x, int y, int z) {   //메서드의 이름은 같지만 반환형과 매개변수가 다름
    return x + y + z;
}

 

  • 오버라이딩
    -상위 클래스에서 상속받은 것을 하위 클래스에서 새롭게 구형하는 것을 말합니다. 오버라이딩된것은 상위 클래스에서 정의된 메소드와 이름, 반환형, 매개변수가 같지만 구현 내용은 다릅니다.
class Animal {
    public void makeSound() {
        System.out.println("The animal makes a sound");
    }
}

class Cat extends Animal {
    public void makeSound() { 
        System.out.println("Meow"); //상위 클래스의 메소드 이름이 같지만 구현 내용이 다름
    }
}

 

 

 

 

SOLID 원칙

 

  • 단일책임의 원칙 (SRP)
    -한 클래스는 한가지 책임만 가져야 한다는 원칙, 즉 하나의 클래스는 하나의 기능을 담당하며 하나의 책임을 수행하는데 집중되어야 한다는 원칙입니다.  만약 한클래스가 여러개의 책임을 가지고 있다면 클래스 수정을 할때 한 클래스를 고치면 다른부분도 고쳐야하는 일이 발생합니다. 따라서 클래스가 하나의 책임을 가지고 있게하여, 프로그램의 유지보수성을 높이기 위한 원칙입니다.
    예를들어 메일 클래스가 있을때 사용자 정보를 저장,이메일 전송, 정보 삭제 등의 다양한 책임을 가지고 있으면 유지보수가 어려워집니다. 따라서 각각의 책임을 가진 클래스로 분리해서 관리해야합니다.

  • 개방 폐쇄 원칙 (OCP)
    -확장엔 열려 있어야하고, 수정은 닫혀있어야 한다는 원칙, 즉, 기능 추가를 할땐 클래스 확장을 통해 구현할 수 있고, 클래스 수정은 최소화 해야 한다는 원칙입니다. 추상화와 와 상속을 활용하여 코드를 작성해야하며  원래있던 클래스에서 수정을 하기보단 상속을 통해 확장하여 구현해야합니다.
    예를들어  상품 클래스가 있을때 할인율 계산하는 메서드가 있다고 가정을 할때 추상화와 상속을 통해 구현하지않으면 각 상품마다 할인율 메서드를 다 따로 수정해야합니다. 따라서 추상화와 상속을 통해 각 상품유형에 맞게 할인율 계산하여 구현해야합니다.

  • 리스코프 치환 원칙 (LSP)
    -서브 타입은 언제나 부모 타입으로 교체할 수 있어야 한다는 원칙, 즉 상속관계에 있을때 하위클래스는 그 상위 클래스와 동일한 방식으로 동작해야 한다는 의미입니다.
    예를들어 자동차 클래스가 있을때 하위 타입에 경찰차,소방차,오픈카 등은 리스코프 치환법칙이 적용되었지만, 헬리콥터,오토바이 등은 자동차 클래스와 치환되지 않으므로 리스코프 치환법칙에 적용되지않습니다.

  • 인터페이스 분리 법칙 (ISP)
    -인터페이스는 클라이언트가 필요로 하는 메서드만 포함해야한다는 원칙, 한꺼번에 너무 많은 기능을가진 인터페이스가 아닌 각각 사용에 맞게 인터페이스를 분리하여 사용해야한다는 원칙입니다.
    예를들어, 게임캐릭터 인터페이스가 있을때  일부캐릭터에는 달리기 기능이 있을수 있고 없을 수 도 있습니다.그럼 게임 캐릭터 인터페이스에 달리기 메서드를 같이 넣는게 아닌 따로 분리해서 필요한 클래스에게만 제공해야합니다.

  • 의존 역전 원칙 (DIP)
    -추상화된 것은 구체적인것에 의존해서는 안된다는 원칙, 즉 어떤 클래스를 참조해서 사용해야하는 상황이면 ,class를 직접 참조하는것이 아니라, 추상클래스,인터페이스를 참조해야한다는 원칙입니다.
    예를들어 핸드폰이라는 클래스가 있을때 새로운'lg폰'을 만든다고 가정을할때 이 클래스는 '삼성폰','아이폰'클래스를 참조하는 것이아닌, 핸드폰이라는 추상클래스,인터페이스를 참조해야합니다.

'자바' 카테고리의 다른 글

자바 예외처리 (try-catch)  (0) 2023.05.12
SOLID원칙  (0) 2023.03.25
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함