Notice
Recent Posts
Recent Comments
Link
«   2026/09   »
일 월 화 수 목 금 토
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
Tags more
Archives
Today
Total
관리 메뉴

seaking110 님의 블로그

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

Today I Learned

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

seaking110 2025. 1. 2. 21:55

 

객체지향 프로그램이란?

 

 

객체란?

  • 세상에 존재하는 물체, 식별이 가능한 것
  • 속성과 행위로 구성
  • 속성 : 필드
  • 행위 : 메서드
  • EX ) 자동차
    • 속성 : 회사, 모델, 색상, 가격, 속도
    • 행위 : 가속 브레이크, 기어변속, 조명, 경적
  • 객체 간의 관계 종류
    • 사용 관계 
      • 사람이 자동차를 사용한다
    • 포함 관계
      • 자동차에는 문이 포함된다
    • 상속 관계
      • 기계 시스템에는 차와 오토바이 등이 포함된다.

 

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

  • 캡술화(encapsulation)
    • 속성 (필드)와 행위(메서드)를 하나로 묶어 객체로 만든 후 내부 구현 내용은 외부에서 알 수 없게 감추는 것
    • 보안상으로 훌륭
    • 외부 객체에서 잘 못 사용하여 객체가 변화하지 않게 할 수 있다.
    • 접근 제어자를 이용해 노출 시킬지 감출 지 결정 가능
  • 상속 ( inheritance)
    • 부모 객체가 가지고 있는 필드와 메서드를 자식 객체가 이를 사용
    • 상속을 함으로써 객체 간의 구조를 파악하기 쉽고 코드의 재사용성이 증가 
  • 다형성 ( Polymorphism )
    • 객체가 연산을 수행할 때 하나의 행위에 대해 각 객체가 가지고 있는 고유한 특성에 따라 다른 여러가지 형태로 재구성 되는 것을 의미
  • 추상화 ( Abstraction )
    • 객체에서 공통된 부분들을 모아 상위 개념으로 새롭게 선언하는 것
    • 모델링 하는 것!

 

클래스를 만들기 위한 4가지 순서

  1. 클래스 선언
  2. 속성 정의
  3. 생성자 정의
  4. 메서드 정의

 

클래스를 인스턴스화 시켜야 사용이 가능하다!

 

 

메서드 오버로딩

  • 하나의 메서드 이름으로 여러 기능을 구현하도록 하는 기능
  • 한 클래스 내에 같은 이름의 메서드라도 매개변수의 개수 또는 타입 또는 순서가 다르면 동일한 이름을 사용해서 메서드를 구현 할 수 있다.
  • 메서드 이름을 절약할 수 있다.
  • 메서드 이름 하나로 상황에 따른 동작을 개별로 정의할 수 있다.

 

  • 기본형 매개변수는 값 자체가 복사되어 넘어가기 때문에 매개값으로 지정된 변수의 원본 값이 변경되지 않는다.
  • 참조형 매개변수는 값의 주소가 복사되어 넘어가기 때문에 변수의 원본 값이 변경된다.

 

 

클래스 멤버

  • 객체 생성 없이도 사용할 수 있는 멤버 EX) main 메서드
  • 클래스 로더에 의해 메서드 영역에 저장되고 사용
  • static 키워드를 사용
  • 메모리를 효율적으로 사용 가능

생성자

  • 객체를 생성할 때 호출되며 객체를 초기화하는 역할
  • 오버로딩을 적용하여 효율적으로 처리 가능

this 와 this()

  • this 키워드를 통해 변수명에 해당하는 객체의 필드에 접근하여 받아온 매개변수의 매개값을 객체의 필드값에 대입하여 저장 가능
  • 객체의 메서드에서 리턴 타입이 인스턴스 자신의 클래스 타입이라면 this를 사용하여 인스턴스 자신의 주소를 반환 가능
  • this에 괄호가 있다면?
  • 생성자의 오버로딩을 할 때 상당히 코드의 중복이 발생 할 수 있음
  • this 키워드를 이용해서 코드의 중복을 없애며 간단하게 코드를 짤 수 있다

this 사용전

public Car(String model) {
    this.model = model;
    this.color = "Blue";
    this.price = 50000000;
}

public Car(String model, String color) {
    this.model = model;
    this.color = color;
    this.price = 50000000;
}

public Car(String model, String color, double price) {
    this.model = model;
    this.color = color;
    this.price = price;
}

 

this 사용 후

public Car(String model) {
    this(model, "Blue", 50000000);
}

public Car(String model, String color) {
    this(model, color, 100000000);
}

public Car(String model, String color, double price) {
    this.model = model;
    this.color = color;
    this.price = price;
}

 

 

  • 주의점 : this() 키워드는 반드시 생성자의 첫 줄에 작성되어야한다!

 

접근 제어자

  • public : 접근 제한 x
  • protected : 같은 패키지 내에서, 다른 패키지의 자손 클래스에서 접근 가능
  • default : 같은 패키지 내
  • private : 같은 클래스 내

 

Getter와 Setter

  • 직접적인 값의 조회 및 세팅 방지!
  • 외부에서 객체의 private 한 필드를 읽을 때 Getter 메서드 사용
  • 외부에서 객체의 private 한 필드를 저장/수정할 필요가 있을 때 Setter 메서드 사용 

 

제어자 사용시 주의 사항

  • 메서드에 static 과 abstract를 함께 사용 x
  • 클래스에 abstract와 final을 동시에 사용 x
  • abstract 메서드의 접근 제어자가 private 일 수 없다
  • 메서드에 private와 final을 같이 사용할 필요 x

 

상속

  • 부모 클래스의 필드와 메서드를 자식 클래스에게 물려준다
  • 코드의 중복을 제거하고 유지 보수성을 높힌다!
  • extends 키워드를 사용하여 상속을 정의
  • 부모보다 자식 클래스가 확장된다!
  • 자바는 기본적으로 다중 상속을 허용하지 않는다.
  • 다중 상속 : 여러 부모를 가지는 것

추가로 알것!

  • Final 클래스는 최종적인 클래스가 됨으로 더 이상 상속할 수 없는 클래스가 된다.
  • Object가 최상위 부모 클래스

 

오버라이딩 override

  • 상속 받은 메서드의 내용을 재정의 하는 것
  • 조건
    • 1. 선언부가 부모 클래스의 메서드와 일치
    • 2. 접근 제어자를 부모 클래스의 메서드 보다 좁은 범위로 변경 x
    • 3. 예외는 부모 클래스의 메서드보다 많이 선언 x

 

super

  • super을 통해 메서드를 상속 받을 시 자식 클래스의 필드 값이 아닌 부모 클래스의 필드 값이 변한다! 

 

다형성

  • 참조 변수의 타입변환
    • 자동
    • 부모 = new 자식()은 가능 -> 하지만 자식 메서드는 실행 불가
    • 자식 = new 부모()는 불가능
    • 강제타입 변환
      • 자동 형변환을 한 아이들은 강제로 다시 돌아갈 수 있다.
    • 다형성이란 여러가지 형태를 가질 수 있는 능력

instance of

  • 다형성 기능으로 인해 해당 클래스 객체의 원래 클래스명을 체크하는것이 필요
  • instance of 를 사용하여 해당 객체가 내가 의도한 클래스의 객체인지 확인
  • (대상 객체) instance of (클래스 이름)
// 다형성

class Parent { }
class Child extends Parent { }
class Brother extends Parent { }


public class Main {
    public static void main(String[] args) {

        Parent p = new Parent();

        System.out.println(p instanceof Object); // true 출력
        System.out.println(p instanceof Parent); // true 출력
        System.out.println(p instanceof Child);  // false 출력

        Parent c = new Child();

        System.out.println(c instanceof Object); // true 출력
        System.out.println(c instanceof Parent); // true 출력
        System.out.println(c instanceof Child);  // true 출력

    }
}

 

 

추상 클래스

  • abstract 키워드를 사용해서 추상 클래스 선언 가능
  • 부모는 완성 시키지 않고 자식이 완성 시키는 클래스
  • 상속 받은 자식 클래스에서 추상 클래스의 메서드는 반드시 오버라이딩 되어야한다
  • 자식 클래스 간의 겹치는 부분을 모아 추상 클래스로 만들 수 있다.

 

인터페이스

  • 두 객체를 연결해주는 다리 역할
  • 상속 관계가 없는 다른 클래스들이 서로 동일한 행위 즉 메서드를 구현해야 할 때 동일한 사용 방법과 행위를 보장.
  • 인터페이스의 구현 클래스는 반드시 정의된 모든 메서드들을 구현
  • interface 키워드를 사용하여 선언
  • 모든 멤버 변수는 public static final 이어야함 (컴파일러가 자동 추가)
  • 모든 메서드는 public abstract 이어야함 (컴파일러가 자동 추가)
  • implements로 인터페이스 구현 가능
  • 인터페이스의 추상메서드 중 일부만 구현해야 한다면 해당 클래스를 추상 클래스로 변경
  • 인터페이스는 클래스와 다르게 다중 상속 가능  

 

디폴트 메서드

  • 디폴트 메서드는 추상 메서드의 기본적인 구현을 제공하는 메서드
  • 메서드 앞에 default 키워드를 붙이며 {} 이 존재
  • 인터페이스는 모든 메서드를 재정의 해야하니 인터페이스에 메서드 하나를 추가하고 다른 연결된 구현체들에서는 구현을 하지 않고 싶을때 사용
  • 추상 메서드가 아니기 때문에 인터페이스의 구현체들에서 필수로 재정의 할 필요 x

 

static 메서드

  • 인터페이스의 static 메서드 또한 객체 없이 호출 가능
  • 인스턴스를 생성하지 않고 호출할 것이라면 static을 사용하는 것이 방법!

'Today I Learned' 카테고리의 다른 글

Generic  (0) 2025.01.06
예외 처리!  (2) 2025.01.03
컬랙션이란?  (0) 2025.01.02
JAVA란?  (2) 2024.12.31
온보딩 프로젝트를 마치며  (0) 2024.12.30