2020년 10월 16일

업데이트:


OOP(Object Oriented Programming)

객체 지향 언어

객체지향 프로그래밍 : 현실 세계의 개체(Entity)를 기계의 부품처럼 하나의 객체로 만들어, 기계적인 부품들을 조립하여 제품을 만들 듯이 소프트웨어를 개발할 때도 객체들을 조립해서 프로그램을 작성할 수 있도록 한 프로그래밍 기법이다.

  • 객체지향 언어의 특징
    • 캡슐화(Encapsulation)
    • 상속(Inheritance)
    • 다형성(Polymorphism)
    • 추상화(Abstraction)
  • 현실에서 객체란?
    자신의 속성(값, data)과 기능(동작, 행동)이 다른 것들과 구분되어 식별 가능한 것

  • 객체 지향 언어란?
    현실 세계는 사물이나 개념처럼 독립되고 구분되는 각각의 객체로 이루어져 있으며 발생하는 모든 사건들은 객체 간의 상호작용이다. 이 개념을 컴퓨터로 옮겨 놓아 만들어낸 것이 객체지향 언어이다.

  • 자바에서 객체란?
    클래스에 정의된 내용대로 new 연산자를 통해 메모리 영역에 생성된 것을 말한다.

클래스(Class)

두 개 이상의 유사한 객체들을 묶어서 하나의 공통된 특성을 표현하는 요소이며 객체의 유형 또는 타입을 의미한다. 즉, 객체의 특성(속성, 기능)에 대해 정의한다.

  • 클래스 필수 요소
    추상화캡슐화가 적용되어야 한다.

추상화(Abstraction)

불필요한 부분을 생략하고 객체의 속성 중 가장 중요한 것에만 중점을 두어 개략화하는 것, 즉 모델화하는 것이다.

국민의 정보를 추상화하여 클래스 다이어그램으로 표현 시 다음과 같다.

접근제어자 표현법                              
public +                              
private -                              
protected #                              
package ~                              


캡슐화

데이터(속성)와 데이터를 처리하는 함수를 하나로 묶는 것을 의미한다. 캡슐화된 객체의 세부 내용이 외부에 은폐(정보 은닉)되어, 변경이 발생할 때 오류의 파급효과가 적다.

  • 캡슐화의 원칙
    • 클래스의 멤버 변수에 대한 접근 권한은 private을 원칙으로 한다.
    • 클래스의 멤버 변수에 대한 연산 처리를 목적으로 하는 멤버 메소드는 클래스 내부에 작성
    • 멤버 메소드는 클래스 밖에서 접근할 수 있도록 public으로 작성
public class Account {
  // VO(Value Object) : 값을 취급하는 객체

  // 속성 정의
  // 이름, 계좌번호, 비밀번호, 은행코드, 잔액

  // 캡슐화 : 속성, 기능을 묶고, 외부로부터 멤버 변수에 직접 접근하는 것을 차단
  // -> 부가 효과로 정보 은닉 발생

  // 멤버 변수
  // public : 누구나 어디서든 접근 가능
  // private : 같은 클래스(객체) 내에서만 접근이 가능함

  private String name = "이한솔";
  private String accountNumber - "123-45-6789";
  private int password = 1234;
  private String bankCode = "002";
  private int balance = 100000;

  // 기능 정의
  // private으로 외부 직접 접근이 제한된 멤버 변수에 간접 접근이
  // 가능하도록하는 메소드(기능) 생성
  // == setter / getter

  // name의 setter
  public void setName(String name){
                      // 매개변수, 전달인자, 파라미터 == 외부로부터 전달 받은 값
      this.name = name;
      // this : 현재 객체
  }

  // getter 작성 규칙
  // public 멤버변수자료형 get멤버변수명() {
  //    return 멤버변수명;
  //}

  // name의 getter
  public String getName() {
        // 반환형 : 메소드가 호출된 후 호출된 곳으로 돌아갈 때 가지고 갈 데이터의 자료형
    return name;
  }
}
// 나머지 멤버 변수의 setter와 getter 생략

// setter와 getter 자동생성 단축키
// alt + shift + s -> r 


필드(Field)

필드는 클래스 바로 아래 작성된 변수로, 같은 클래스 내 어디서든 접근이 가능한 변수이다.

// 표현식
[접근제한자] [예약어] class 클래스명 {
  [접근제한자] [예약어] 자료형 변수명 [= 초기값];
}
기호 접근제한자 해당 클래스 내부 같은 패키지 내 후손 클래스 내 전체                
+ public O O O O                
# protected O O O                  
~ (default) O O                    
- private O                      


필드 예약어 - static
같은 타입의 여러 객체가 공유할 목적의 필드에 사용하며, 프로그램 시작 시에 정적 메모리(Static) 영역에 자동 할당되는 멤버에 적용

public class FieldService {
  private int num1;
  private static int num2;
}


// 다른 클래스에서 static 변수를 사용하는 법
FieldService.num2 = 30;
// 클래스명.static변수명

FieldService fs = new FieldService();
fs.num2 = 30;
// 위의 방법은 정상 실행되나 static 변수를 사용하는 일반적인 방법이 아님

FieldService fs2 = new FieldService();
fs2.num2 = 30;



필드 예약어 - final
하나의 값만 계속 저장해야 하는 변수에 사용하는 예약어

public class FieldService {
  private final int NUM1;
  // final 예약어가 붙은 필드명은 모두 대문자로 표기
}


생성자

객체가 new 연산자를 통해 Heap 메모리 영역에 할당될 때 객체 안에서 만들어지는 필드 초기화 + 생성 시 필요한 기능 수행. 생성자는 일종의 메소드로 전달된 초기값을 받아서 객체의 필드에 기록한다.

생성자 규칙
생성자의 선언은 메소드 선언과 유사하나 반환 값이 없으며 생성자명을 클래스명과 똑같이 지정해주어야한다.

[접근제한자] [예약어] class 클래스명 {
  [접근제한자] 클래스명() {}
  [접근제한자] 클래스명(매개변수) {(this).필드명 = 매개변수;}
}

기본 생성자
생성자를 작성하지 않은 경우, 클래스 사용 시 JVM에서 자동으로 기본 생성자를 생성한다.

매개변수 생성자

  • 객체 생성 시 전달받은 값으로 객체를 초기화하기 위해 사용한다.
  • 매개변수 생성자 작성 시 JVM이 기본 생성자를 자동으로 생성해주지 않는다.
  • 상속에서 사용 시 반드시 기본 생성자를 작성한다.
  • 오버로딩을 이용하여 작성

오버로딩
한 클래스 내에 동일한 이름의 메소드를 여러 개 작성하는 기법

  • 조건
    • 같은 메소드 이름
    • 다른 매개변수의 개수 또는 다른 매개변수 타입
public class Book {
  // 속성 (필드)
  private String title; // 책 제목
  private String author; // 저자
  private String content; // 내용
  private String publisher; // 출판사
  private int price; // 가격

  public Book() {
    // 클래스 내에 생성자가 하나도 작성되지 않은 경우 
    // 컴파일 시 자동으로 기본 생성자가 추가됨.
    System.out.println("Book() 기본 생성자로 생성됨.");
  }

  // 매개변수가 있는 생성자
  // 객체 생성 시 전달받은 값을 객체 필드 초기화용으로 사용
  // 자동 생성되지 않고, 개발자 필요에 의해 작성되는 생성자.
  public Book(String title, String author, String content, String publisher, int price) {
    this.title = title;
    this.author = author;
    this.content = content;
    this.publisher = publisher;
    this.price = price;
  }

  // 오버로딩 : 한 클래스 내에 동일한 이름의 메소드를 여러 개 작성하는 기법
  // 조건 1) 메소드명 동일
  // 조건 2) 매개변수의 개수, 타입, 순서가 달라야 함
  public Book(String title, String author, int price){
    this.title = title;
    this.author = author;
    this.price = price;
  }

  public Book(String title, String author){
    // 매개변수 개수 감소 (3 -> 2)
  }

  public Book(int price, String title, String author){
    // 매개변수 순서 변경
  }

  /*
  public Book(String content, String publisher, int price){
    // 매개변수 변수명 변경 -> 에러
    // -> 오버로딩 시 매개변수명은 중요하지 않음. 타입이 중요!!
  }
  */

  // title setter
  public void setTitle(String title){
    this.title = title;
  }

  // title getter
  public String getTitle() {
    return title;
  }
}

// toString() 메소드 자동 추가하기
// alt + shift + s -> s


this()

생성자, 같은 클래스의 다른 생성자를 호출할 때 사용하며 반드시 첫 번째 줄에 선언해야 함.

public class Book {
  public Book(String title, String author, String content, String publisher, int price) {
    this.title = title;
    this.author = author;
    this.content = content;
    this.publisher = publisher;
    this.price = price;
  }

  public Book(String title, String author, int price){
    this.title = title;
    this.author = author;
    this.price = price;
  }
}

//위의 두 개의 생성자가 중복된 코드를 짧게 만들기.
  public Book(String title, String author, String content, String publisher, int price) {
    // this() 생성자
    // 같은 클래스 내에서 다른 생성자를 부를 때 사용한다.
    // - 이점 : 코드 길이 감소, 생성자 재사용성 증가!
    this(title, author,price);
    this.content = content;
    this.publisher = publisher;
  }

    public Book(String title, String author, int price){
    this.title = title;
    this.author = author;
    this.price = price;
  }

태그:

카테고리:

업데이트:

댓글남기기