[JAVA]OOP(Object Oriented Programming)

hyelim·2023년 4월 29일
0

JAVA

목록 보기
10/13
post-thumbnail

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

  • 객체 지향 프로그래밍 이란, 많은 객체(Objcet)들이 모여서 상호 협력하면서 데이터를 처리하는 방식의 프로그래밍 설계 방법을 일컫는다.

  • 좀더 쉽게 말하면, 프로그램을 묶음 단위로 잘게 쪼개서, 추후에 가져다 쓰기 편하게 만들어 놓은 프로그래밍 방식이라고 보면 된다.

  • 이처럼 레고 블럭 조립하듯이 컴포넌트를 유연하고 변경이 용이하기 때문에, 현업에서 대규모 소프트웨어 개발에 많이 사용된다.

  • 대표적으로 많이 알려진 Java언어를 포함하여 Ruby Python, C++, Objectivc-C, C#, Kotlin 등이 모두 객체지향 요소를 가진 언어이다.

  • 컴퓨터 프로그램을 어떤 데이터를 입력받아 순서대로 처리하고 결과를 도출하는 명령어들의 목록으로 보는 시각에서 벗어나 여러 독립적인 부품들의 조합, 즉 객체들의 유기적인 협력과 결합으로 파악하고자 하는 컴퓨터 프로그래밍의 패러다임

  • 객체 지향적으로 소프트웨어를 설계한다는 말의 의미는 어떤 프로그램의 일부분에 해당하는 작은 부품, 즉 객체를 먼저 만들고 이렇게 만들어진 여러 객체들을 조립해서 하나의 완성된 프로그램을 만드는 프로그래밍 방법론

🏷️ 객체 지향 프로그래밍의 장점

  1. 객체 지향적 설계를 통해서 프로그램을 보다 유연하고 변경이 용이하게 만들 수 있다
    객체 지향적 원리를 잘 적용해 둔 프로그램은 각각의 부품들이 각자의 독립적인 역할을 가지기 때문에 코드의 변경을 최소화하고 유지보수를 하는 데 유리
  2. 코드의 재사용을 통해 반복적인 코드를 최소화하고, 코드를 최대한 간결하게 표현
    객체 지향 프로그래밍은 실제 우리가 보고 경험하는 세계를 최대한 프로그램 설계에 반영하기 위한 지속적인 노력을 통해 발전해왔기 때문에, 보다 인간 친화적이고 직관적인 코드를 작성하기에 용이
  • 프로그램을 독립된 단위의 객체들의 모임으로 보고 각각 객체는 메시지를 주고 받고 데이터를 처리함

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

추상화, 상속, 다형성, 캡슐화
모두 이러한 객체 지향적 설계의 이점들을 가장 잘 살릴 수 있는 방향으로 발전되어 왔다

  1. 추상화(Abstraction)- 핵심적인 코드만 보여주기

    • 불필요한 부분을 숨긴다.
    • 인터페이스와 구현을 분리한다.
    interface DiscountPolicy{ 
    		//할인되는 가격 반환
    		public int discount(Member member, int price); 
    }
    
    class RateDiscountPolicy implements DiscountPolicy{
    
    		//상품 가격의 10%를 할인하여 할인되는 가격을 반환
        @Override
    		 public int discount(Member member, int price){...}
    }

    위 코드는 RateDiscountPolicy클래스가 DiscountPolicy 인터페이스를 상속 받는다.

    DiscountPolicy discountPolicy = new RateDiscountPolicy();
    discountPolicy.discount(member, 10000);

    이때 실행되는 discount메서드는 자식 클래스인 RateDiscountPolicy의 메서드이다.

    하지만 실행클래스에서는 RateDiscoutPolicy객체를 DiscountPolicy타입으로 바꿔 사용하고 있기 때문에 RateDiscoutPolicy의 구현부를 알지 못한다.

    따라서 구현 객체에 의존하지 않고 추상객체인 인터페이스에 의존함으로써 구현 코드를 숨긴다.

  2. 캡슐화(encapsulation)- 데이터 보호

    • 데이터 캡슐화 : 필드와 메서드를 하나로 묶는 것
    • 은닉화 : 객체의 세부 내용이 외부에 드러나지 않아 외부에서 데이터를 직접 접근하는 것을 방지한다.
    public class Person{
        private int age;
        private String name;
    
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age= age;
        }
    
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
    }

    이 클래스의 이름, 나이는 접근제한자가 private이기 때문에 직접 바꿀 수 없으며 get, set함수로만 접근할 수 있다.

  3. 상속(inheritance)- 코드 재사용
    부모 클래스에서 정의된 메서드나 변수를 자식 클래스에서 재사용할 수 있도록 해준다
    자식 클래스는 부모 클래스의 모든 멤버를 상속받게 되며, 이를 통해 코드의 재사용성과 유지보수성을 향상시킬 수 있다

    ```java
    class Animal { 
    		private String name;
    
    		public void setName(String name) {
            this.name = name;
        }
    		public abstract void cry(){
    				System.out.println("ㅜㅜㅜ");
    		}
    }
    
    class Cat extends Animal {
    
        public void cry() {
            System.out.println("냐옹냐옹!");
        }
    }
    ```
  4. 다형성(polymorphism)- 객체 변경 용이
    객체지향 프로그래밍의 특성 중 하나로, 같은 이름의 메서드가 서로 다른 클래스에서 다른 동작을 하는 것
    이를 통해 하나의 인터페이스를 사용하여 여러 종류의 객체를 다룰 수 있다.
    오버라이딩은 다형성을 구현하는 방법 중 하나이다

  • 오버라이딩: 부모 클래스 메소드를 자식클래스에서 재정의하는 것
    - 조건 : 부모 클래스의 메소드를 재정의하는 것이므로, 자식 클래스에서는 오버라이딩하고자 하는 메소드의 이름, 매개변수, 리턴 값이 모두 같아야 한다.

    오버로딩: 한 클래스에서 메소드이름은 같지만 파라미터 개수나 자료형을 다르게 하여 서로 다르게 동작하게 하는 것
    - 조건 : 메소드의 이름이 같고, 매개변수의 개수나 타입이 달라야 한다. 주의할 점은 '리턴 값만' 다른 것은 오버로딩을 할 수 없다는 것이다.

Person student=new Student();
student.show();

위 함수를 실행 시, student의 show()함수가 호출된다.

위의 함수는 처음 student 객체를 생성할 때, Person student=(Person) new Student();과 같은 캐스팅이 생략되어있다. 고로 컴파일 시점에는 Person객체의 show로 인지한다.
하지만 실제 실행될 때는 동적바인딩이 발생한다

동적바인딩은 런타임 시점에 객체 타입을 기준으로 실행될 함수를 실행하는 것이다.

즉, 실제 실행되는 시점에는 Student객체가 생성되어 해당객체의 show()함수를 호출하는 것이다

요약하면 다형성 적용시, 컴파일 시점과 런타임 시점에서 참조하는 변수가 다르다는 것을 알 수 있다. 이는 오버라이딩의 영향이다

정리하자면 오버로딩(overloading) 은 한 클래스내에, 여러개의 같은 이름의 메소드를 정의하는 것을 말한다. 이렇게 메소드의 이름을 동일하게 만들어 프로그램의 가독성을 증가시킬 수 있다는 장점이 있다
오버라이딩(overriding) 은 부모로부터 받은 메소드의 로직을 입맛에 맞게 변경하는 것이다. 객체지향언어의 특징인 다형성중에 하나이다. 상속된 메서드를 자식메서드에서 재구현한다는 점에서 상속해도 속한다. 즉 상속에 속하면서 다형성의 개념을 사용하는 것이다

참조

https://hyoje420.tistory.com/14

profile
기록용

0개의 댓글