Home [Java basic] 08. 객체 지향 프로그래밍의 활용
Post
Cancel

[Java basic] 08. 객체 지향 프로그래밍의 활용

1. 생성자

생성자(constructor)란

  • 클래스로부터 객체를 만드는 특별한 메소드
  • 클래스 → 객체를 돕는 메소드
  • ex. 과거 코드 - Person 객체를 만들고 필드를 초기화 하는 예
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
      class Person{
          String name;
          int age;
      }
      public static void main(String[] args){
          Person p = new Person();
          p.name = "홍길동";
          p.age = 24;
      }
    
  • ex. 생성자를 활용하여 변경한 코드 예
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
      class Person{
          String name;
          int age;
    	
          // 생성자 정의
          Person(String n, int a){
              name = n;
              age = a;
          }
      }
      public static void main(String[] args){
          // 생성자 호출
          Person p = new Person("홍길동", 24);
      }
    

기본 생성자(default constructor)

  • 자동 적용되는 생성자
  • 클래스에 아무런 생성자가 없는 경우 자동으로 추가
  • 입력 변수가 없음
  • ex. 기본 생성자 예시
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
      class Cola {
          ...
          public Cola(){} // 기본 생성자: 클래스에 생성자가 없다면 자바에서 코드 실행 시 자동 생성
      }
      public class DrinkTest(){
          public static void main(String[] args){
              Cola c = new Cola();  // 따라서 생성자 호출 가능
          }
      }
    
  • 기본 생성자 덕분에 생성자가 없음에도 호출 가능 → 기본 생성자가 자동 삽입되기 때문

    ➣ 단, 생성자를 명시해주면 기본 생성자는 사라지기 때문에 입력 변수가 없는 생성자를 사용하려면 다시 만들어 주어야한다. (method overloading)

  • ex. Drink클래스 안에서 생성자를 2개 만들어주기
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
      class Drink {
          String name;
          int  price;
          Drink(String n, int  p) {
              name = n;
              price = p;
          }
          Drink(){} // 써야지 아래 'Drink d1 = new Drink();'에서 에러가 안남!
      }
      public  class DrinkTest {
          public  static  void main(String[] args) {
              Drink d1 = new Drink();
              Drink d2 = new Drink("박카스", 800);
          }
      }
    

2. 참조변수

참조변수(reference variable)이란

  • 객체를 가리키는 변수
  • 대상의 주소를 저장
  • 자신의 타입을 기준으로 가리키는 대상 해석

기본변수와의 차이

 기본변수레퍼런스변수
저장데이터값을 직접 저장주소를 저장
원본 공유 여부같은 값을 가지더라도 다른 사본임서로 같은 값을 공유
타입 표기소문자로 시작관례상 대문자로 시작

3. static 키워드

static 이란

  • 공유의 개념을 지닌 키워드
  • 클래스의 필드(클래스 변수)와 메소드(클래스 메소드)에 적용 가능

클래스 변수(class variable)

  • static이 적용된 필드
  • 객체들이 공유하는 변수
  • 객체 외부(클래스 영역)에 존재하는 필드
    • 인스턴스 변수는 객체 내부에 존재한다.
  • 프로그램이 실행되기 전 클래스를 불러오는 시점에 만들어짐
  • ex. 클래스 변수와 인스턴스 변수의 사용 예시
    1
    2
    3
    4
    
      class Person {
          static int count = 0;   // 클래스변수(static 필드) -> 프로그램 실행 전 생성됨, 객체 외부 클래스 영역에 존재
          int name; 				// 인스턴스변수(non-static 필드) -> 생성자 호출시 만들어지며, 각 객체 내부에 존재
      }
    
  • 클래스 변수는 dot 연산자를 통해 값을 가져오거나 변경 가능
    1
    
      Person.count += 1;
    

인스턴스 변수와 차이

 인스턴스변수클래스변수
영역객체 내부에 존재객체 외부(클래스 영역)에 존재
생성 시점생성자 호출 시프로그램 실행 전

➣ 클래스 영역 & 힙 영역 & 스택 영역

  • 클래스 영역(class area)
    • 클래스와 static 변수등을 관리하는 메모리 공간
    • 프로그램 수행 전 초기화
  • 힙영역(heap area)
    • 객체를 관리하는 메모리 공간
    • 프로그램 수행 중 new 키워드로 생성된 객체를 관리
  • 스택 영역(stack area)
    • 후입선출(LIFO: Last In First Out)특징을 지닌 메모리 공간
    • 메소드 관련 정보(입력 변수, 지역 변수 등)을 관리

클래스 메소드(class method)

  • static이 적용된 메소드
  • 주체 객체 없이 수행 가능
  • 주로 간단한 기능 구현을 위해 사용
  • ex. Math class 메소드 사용 예시
    1
    
      double x = Math.random(); // 임의의 0.0 이상 1.0 미만의 실수를 반환
    

클래스 메소드 호출 vs 인스턴스 메소드 호출

  • 클래스 메소드(static method) 호출
    • 객체 생성 없이 클래스명을 통해 호출
    • 편의성 기능 구현에 유리
  • 인스턴스 메소드(non-static method) 호출
    • 주 객체를 통해서만 실행 가능
    • 수행 전 객체 생성이 필수

4. 접근 제한자

접근제한자(access modifier)란

  • 외부 접근을 제어하는 키워드
  • 정보를 감추거나 공개하기 위해 사용
  • 클래스, 필드, 메소드 등에 적용 가능

접근 제한자의 종류

  • public
    • 모든 클래스의 접근을 허용
  • protected
    • 동일한 패키지 또는 상속 관계가 있는 클래스의 접근 허용
  • default
    • 동일 패키지(폴더)에 존재하는 클래스의 접근 허용
  • private
    • 모든 클래스의 접근을 거부

접근 제한자의 허용 범위

구분동일 클래스동일 패키지자식(자손) 클래스외부 패키지
publicOOOO
protectedOOOX
defaultOOXX
privateOXXX

private와 public

  • private
    • 내부 접근만 허용
    • 일반적으로 필드에 적용
    • 정보 은닉(information hiding)
      • 객체의 정보를 외부로부터 감추는 것
      • private을 사용한 정보 은닉은 필드 뿐 아니라 메소드에도 적용 가능
  • public
    • 모든 외부 접근을 허용
    • 일반적으로 메소드에 적용

게터 메소드(getter method)

  • class 외부에서 private 선언한 필드를 사용하기 위한 메소드
  • public 메소드를 통해 우회하여 접근해야 함
  • get + 필드명 형태로 작성
  • 반환값은 대상 필드와 같음

세터 메소드(setter method)

  • class 외부에서 private 선언한 필드를 변경하기 위한 메소드
  • set + 필드명 형태로 작성
  • 반환값은 void

getter, setter 예시

  • 매개 변수와 필드 이름이 같을 경우 setter 메소드에서는 다음과 같이 나타낸다.
    • 매개 변수 phoneNum → phoneNum
    • 필드 phoneNum → this.phoneNum
  • ex. private phoneNum에 접근하기 위한 getter, setter method
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
      class Person {
          private int phoneNum;
          public int getPhoneNum() {
              return phoneNum;
          }
          public void setBalance(int phoneNum) {
              this.phoneNum = phoneNum;
          }
      }
    

5. 소프트웨어 디자인 패턴

  • 소프트웨어 공학의 소프트웨어 디자인에서 특정 문맥에서 공통적으로 발생하는 문제에 대해 재사용 가능한 해결책
  • 공통된 문제들을 해결하는데 좋다

MVC(Model-View-Controller) 패턴

Alt text

Model

  • 데이터와 관련된 일(저장, 가공)
  • 애플리케이션 데이터 표현
  • 비즈니스로직과 관련된 부분 처리
  • 데이터베이스 관련로직 구현

View

  • 사용자 인터페이스 요소
  • 데이터 시각화
  • 사용자 데이터 입력

Controller

  • Model과 View를 연결
  • 사용자가 View(GUI)를 통해 입력하면 Model(Data) 변경

Builder 패턴

  • 복합 객체의 생성 과정과 표현 방법을 분리 → 동일한 생성 절차에서 다른 표현 결과를 만들 수 있게 하는 패턴
  • 객체 클래스 내부에 여러 개의 생성자를 만들 필요가 없음
  • build()함수로 검증 가능
  • 직관적임
  • setting method naming을 통해 값을 파악하는데 용이
This post is licensed under CC BY 4.0 by the author.