[Java/자바] 2. 객체지향 Object-Oriented (1)

객체지향 Object Oriented Programming

절차지향 프로그래밍이 주였던 환경에서 모듈화된 소프트웨어의 필요성 대두 → 객체지향 프로그래밍 등장

객체 Object

현실 세계에 존재하는 유/무형의 모든 것

정적 요소: 변수 Variable

Modifier for Variable
  • 접근 권한

    • public: 모든 클래스에서 접근 가능
    • protected: 동일 패키지에 속하는 클래스와 하위 클래스 관계의 클래스에 의해 접근 가능
    • private: 변수가 선언된 클래스 내에서만 접근 가능
    • (default): 선언된 클래스와 동일 패키지 내에서 접근 가능
  • 활용 방법

    • final: 변수를 상수로 이용하는 경우
    • static: 클래스에 소속된 클래스 변수를 의미, 일반적으로 클래스 변수라고 함

동적 요소: 메소드 Method

  • 일종의 함수(function)으로 클래스가 제공할 로직들을 정의한다.
  • 반환값이 있다면 반환형을 선안하고, 없다면 void를 선언한다.
  • 메소드 시그니처(signature) = {반환형, 메서드명, 매개변수}
  • 예시

    public int sum(int num1, int num2){
        int sum = 0;
        sum = num1 + num2;
        return sum;
    }
Modifier for Method
  • 접근 권한

    • public: 모든 클래스에서 접근 가능
    • protected: 동일 패키지의 클래스, 하위 클래스에서 접근 가능
    • private: 클래스 내에서만 접근 가능
  • 활용 방법

    • final: Overriding 불가능한 메소드임을 의미
    • static:클래스에 소속된 클래스 메소드를 의미, 클래스 생성 시 만들어진다.
    • abstract: 추상 메소드를 의미, 하위 클래스에 의해 구현된다.
    • synchronized: Thread 동기화를 위한 메소드

클래스 Class

현실 세계의 객체를 프로그램에서 이용할 수 있는 객체로 변환하는 것. 즉, 클래스는 현실 세계의 객체를 컴퓨터 메모리에 생성할 수 있는 템플릿

구조

[access modifier] class 클래스명 [extends 부모 클래스명]{ // 클래스 선언부

    // 클래스 몸체
    [access modifier] 클래스명(argument list){} // 생성자(constructor), 클래스명과 이름이 같은 메소드로 클래스로부터 객체를 생성할 때 사용함
    [access modifier] 데이터 타입 변수명 [=초기값]; // 변수 선언
    [access modifier] return_type 메소드명(argument list){} // 메소드 선언
}

Modifier for Class

  • 접근 제한자, 접근 지정자, 접근 권한 예약어 ex: public - 모든 클래스에서 접근이 가능한 클래스임을 의미, private, protected, (default)
  • 활용 방법 예약어 ex: final - 자식 클래스를 가질 수 없는 클래스 임을 의미, abstract - 객체 생성이 불가능한 추상클래스를 의미, static, transient, native , ..etc.

접근 권한과 관련된 Modifier를 지정하지 않으면, 같은 패키지 내의 클래스에서만 접근 가능하다. 서로 다른 패키지의 클래스에 접근하기 위해서는 public으로 지정해야한다.

객체 생성

Car Yellow = new Car(); // 클래스 이름 객체참조변수이름 = new 클래스이름();

인스턴스 Instance

컴퓨터 메모리에 존재하는 객체로 클래스로부터 생성된 메모리 상의 객체라고 할 수 있다.

객체 - 클래스 - 인스턴스의 관계

현실 세계의 객체를 클래스라는 템플릿을 통해 인스턴스로 만듦. 따라서 객체와 인스턴스를 동일안 것으로 간주할 수 있다.

지정자 Modifier

  1. static예약어

    • static이 붙지 않는 인스턴스 변수

      • 생성된 인스턴스마다 그 안에 클래스의 인스턴스 변수들이 포함됨
      • 일반적인 멤버 변수를 인스턴스 변수라고 부름
      • 즉, 클래스로부터 객체가 생성될 때마다 각 객체의 변수들이 생성된다.
      • 한 객체의 값이 변경되어도 다른 객체의 값에 영향을 주지 않는다.
    • static이 붙는 클래스 변수

      • 클래스로부터 생성된 인스턴스에 포함되지 않는 변수
      • 많은 인스턴스를 생성하더라도 메모리에 하나의 변수만 존재
      • 객체를 생성하지 않고도 접근할 수 있는 변수 - 일반적으로 클래스 이름을 통해서 접근한다.
      • 즉, 클래스로부터 생성된 모든 객체들이 하나의 클래스 변수를 공유한다.
      • 객체가 생성될 때 메모리 영역을 할당하지 않고 클래스가 로딩되는 과정에서 메모리에 한 번만 할당되는 멤버
      • 따라서 클래스 변수의 값이 변경되는 경우, 클래스로부터 생성된 모든 객체에서 변경된 값을 사용 가능하다.
    • static이 붙는 클래스 메소드

      • 클래스로부터 인스턴스를 생성하지 않고 호출이 가능
      • 인스턴스 변수는 인스턴스를 생성해야만 메모리가 잡히기 때문에 클래스 메소드에서는 인스턴스 변수를 호출할 수 없다. 즉, 클래스 메소드에서는 클래스 메소드만 호출할 수 있다.
  2. final예약어

final이 붙은 변수는 한 번 초기화하면 그 이후에 값을 변경할 수 없다.

👉 클래스 변수를 선언할 때, 만약 변수의 값을 변경할 수 있도록 허용한다면 static예약어의 의미가 상실되기 때문어 final예약어를 결합하여 사용해 초기화된 값을 변경할 수 없게 한다.

👉 클래스 메소드를 선언할 때, final예약어를 사용하여 메소드 오버라이딩을 막을 수 있다.

👉 클래스를 선언할 때 final예약어를 사용하여 상속을 금지할 수 있다.

  1. abstract예약어

추상 클래스/메소드를 정의한다는 의미로 메소드 시그니처만 정의되고 구체적인 행위는 정의되지 않는 메소드를 의미한다.

abstract returnType name([argType argName, ...]);

추상 메소드를 포함하고 있는 클래스는 추상 클래스로 표현되어야 한다. 물론 추상 메소드를 포함하지 않은 클래스도 추상 클래스로 표현 가능

abstract class SuperClass{
    public void methodA(){
        System.out.println();
    }
    public abstract void methodB();
}
class SubClass extends SuperClass{
    //부모 클래스에 추상 메소드가 있기 때문에 자식 클래스도 추상 클래스로 바꾸지 않고 
    //일반 클래스에서 오류 없이 상속을 받기 위해서는 
    //부모 클래스의 추상 메소드를 오버라이딩 해야한다
    public void methodB(){
        System.out.println();
    }
}

객체 지향 언어의 주요 개념

상속 Inheritance

  • 부모(상위 클래스, 슈퍼 클래스)의 속성을 자식(하위 클래스, 서브 클래스)이 상속 받을 수 있다.
  • 클래스들 사이에 공통된 속성이나 기능들이 있을 경우, 상속을 통해 재사용성을 높일 수 있다. 또한 중복된 코드를 줄여 코드를 간결하게 만듦으로써 유지보수도 편리해진다.
  • 부모 클래스와 자식 클래스의 관계가 일반화, 특별화 관계에 있어야 한다. 문법적으로 강제되는 것이 아니라 논리적으로 판단되어야 한다.
  • 상속을 통해 객체들 사이의 계층 구조를 이룰 수 있다. 상위 계층으로 갈수록 일반화, 보편화된 클래스들이고 하위 계층으로 갈수록 특수화, 개별화된 클래스들이다.

    public class Car{
        String name;
        int currentGear;
    }
    public class Taxi extends Car{ //extends 예약어를 통해 Car 클래스의 변수, 메소드를 모두 물려받았다.
        int fare;
    }

다형성 Polymorphism

  • “One interface, multiple implementation” - “하나의 인터페이스를 이용해 서로 다른 구현을 제공함”

메소드 오버로딩 Overloading

한 클래스 안에 같은 이름의 메소드를 여러 개 정의하면서, 인자의 개수나 유형을 다르게 해 놓은 형태

메소드 오버라이딩 Overriding

  • 상속 관게에 있는 하위 클래스가 상위 클래스로부터 받은 메소드를 재정의 하는 것.
  • 재정의된 메소드가 선언된 형태는 상위 클래스에서 선언된 것과 같음.
오버로딩 오버라이딩
같은 이름의 메소드끼리 인자의 개수/유형이 다름 같은 이름의 메소드(상위, 하위)가 완전히 똑같음

추상화 Abstraction

  • 구체적인 사실들을 일반화시켜 기술하는 것
  • 현실 세계에 존재하는 다양한 객체들의 공통된 특성을 모아 일반화 해놓은 것으로 클래스를 정의하는데 중요한 역할을 한다.

캡슐화 Encapsulation

  • 변수와 메소드를 하나의 추상화된 클래스로 묶는 과정을 의미한다. 이를 통해 각 요소들이 독립적으로 동작하지 않도록 할 수 있다.
  • 객체의 메소드를 통해 객체를 이용하되, 데이터가 실제로 어떻게 처리되는지는 알 필요가 없다.

정보 은닉 Information Hiding

객체지향 언어에서는 캡슐화된 변수나 메소드를 선택적으로 공개하거나 숨길 수 있다. Using private: 비공개 정보, public: 공개 정보

  • 멤버 변수들은 대부분의 경우 private로 선언해서 외부에서는 숨겨진 형태로 만드는 것이 일반적이다.
  • public으로 지정한 메소드를 통해 접근하도록 클래스를 구현한다. 🗝 위의 두 가지가 정보은닉의 기본

get____(): Getter 메소드 set____(): Setter 메소드

메세지 Message

  • 객체 간에 서로 통신하는 방법
  • 객체 간에 메세지를 주고 받기 때문에 여러 객체는 동일한 프로세스를 가질 필요가 없음
  • 서로 메세지를 주고받는 것에 대해 객체가 존재하는 위치는 제약이 되지 않는다.

생성자 Constructor

  • 클래스로부터 객체를 생성할 때 호출되며, 객체의 멤버 변수를 초기화하는데 사용되는 메소드
  • 객체를 생성할 때 객체에 필요한 값들을 초기화하는 개념은 배열과 동일
  • 생성자는 클래스와 같은 이름을 가진 특별한 메소드로, 객체 생성 시 멤버 변수의 초기화를 담당
  • 일반 멤버 메소드와 다르게 반환형이 없다. void도 불가
  • 생성자는 이름은 같지만 매개변수를 달리하여 오버로딩할 수 있다.
  • 생성자는 생성 연산자 new와 항상 같이 사용된다.
  • 명시적으로 작성하지 않을 경우 기본 생성자가 제공된다.
  • 생성자 내부에는 멤버 변수 초기화에 필요한 코드가 기술된다.

기본 생성자

  • 클래스에 생성자가 하나도 정의되지 않은 경우, 컴파일러에 의해 자동으로 생성되는 생성자
  • 클래스에 생성자가 하나라도 정의되어 있는 경우 기본생성자가 자동으로 제공되지 않는다.

this

  • 생성자나 메소드의 매개변수 이름이 객체 변수의 이름과 같을 때 this예약어를 사용
  • 코드의 가독성을 높일 수 있다.
  • 생성자에서만 아니라 일반 메소드에서도 유용하게 사용할 수 있다.

Hi! I'm @Yeseul Lee
Passionate for what I love

GitHubLinkedIn