1. 객체 지향 프로그래밍

객체 지향 프로그래밍(OOP: Object Oriented Programming)
부품에 해당하는 객체들을 먼저 만들고, 이것들을 하나씩 조립해서 완성된 프로그램 기법

  • 객체(Object)란?
    자신의 속성을 가지고 있고 다른 것과 식별 가능한 것.
    현실 세계의 객체를 소프트웨어 객체로 설계하는 것(필드/메소트로 정의하는 과정)을 객체 모델링(Obejct Modeling)이라 함.

  • 특징

    • 캡슐화(Encapsulation)
      객체의 필드, 메소드를 하나로 묶고, 실제 구현내용을 감추는 것.
      외부 객체는 객체 내부의 구조를 알지 못하며 객체가 노출해서 제공하는 필드와 메소드만 이용할 수 있음.
      외부의 잘못된 사용으로 객체가 손상되는 것을 방지하며, 노출 여부는 접근 제한자(Access Modifer)를 사용.

    • 상속(Inheritance)
      상위 객체가 자신이 가지고 있는 필드/메소드를 하위 객체에세 물려주어 하위 객체가 사용할 수 있도록 하는 것.
      하위 객체를 쉽고 빨리 설계할 수 있도록 해주며, 코드의 중복을 감소시키고, 유지 보수 시간을 최소화 시켜 줌.

    • 다형성(Polymorphism)
      같은 타입이지만 실행 결과가 다양한 객체를 이용할 수 있는 성질.
      자바는 다형성을 위해 부모 클래스 또는 인터페이스 타입 변환을 허용.

2. 객체와 클래스

  • 클래스

    객체를 생성하기 위한 필드와 메소드가 정의되어 있음.

    • 선언 규칙

      작성 규칙
      하나 이상의 문자로 이루어져야 한다. Student, Food
      첫 번째 글자는 숫자가 올 수 없다. 4Student(X)
      ’$’, ‘_’ 외의 특수 문자는 올 수 없다. #Food(X)
      자바 키워드는 사용할 수 없다. int(x), for(x)

      관례로 첫 글자는 대문자로 작성하며, 영어 대소문자를 구분함.

    • 클래스 용도

    라이브러리 클래스: 다른 클래스에서 이용할 목적으로 설계
    실행 클래스: 프로그램의 실행 진입점인 main() 메소드를 제공. 실행클래스에서 라이브러리 클래스를 호출하여 활용하는 경우가 많음.

  • 객체
    • 사용법
      new연산자를 사용.
    // 1. 클래스 변수 선언 후 해당 변수에 객체의 주소 저장
    Student s1;
    s1 = new Student();
    
    // 2. 클래스 변수 선언과 객체 생성을 동시에 실행
    Student s2 = new Student();
    

3. 클래스의 구성 멤버

public class Student {

    // 필드
    int name;

    // 생성자
    Student() { ... }

    // 메소드
    int EditStudent() { ... }

}
  • 필드

    고유 데이터, 부품 객체, 상태 정보를 저장하는 곳.
    변수와 비슷하지만 “필드≠변수” 이다.

    필드: 생성자와 메소드 전체에서 사용되며 객체가 소멸될 때까지 사용.
    변수: 생성자와 메소드 내에서만 사용되고 생성자/메소드 실행 종료 시 자동 소멸.

    • 선언
      클래스 중괄호{} 블록 어디서든 가능. (생성자, 메소드 내부 불가)
      초기값이 지정되지 않은 경우, 기본 초기값으로 설정.

    • 사용

    클래스 내부: 단순히 필드 이름으로 읽고 변경.
    클래스 외부: 클래스 객체 생성 후 필드 사용.

  • 생성자

    객체 생성 시 초기화를 담당.
    클래스 이름으로 되어 있고 리턴 타입이 없음.

    • 선언
      생성자에 매개변수가 있는 경우 new연산자로 생성자를 호출할 때 외부의 값을 생상자 블록으로 전달.
    // 클래스 객체 생성 및 생성자 호출
    Student s1 = new Student("홍길동",21,"컴퓨터공학과");
    
    // Student 클래스
    public class Student {
    
        // 생성자
        Student(string name, int age, string major){
            ...
        }
    }
    
    • 생성자를 통한 필드 초기화
      첫 번째, 정해진 초기값을 주는 방법.
      두 번째, 매개값으로 전달된 값을 초기값으로 설정하는 방법.

      2번의 방법을 쓰는 경우, 관례적으로 매개변수 이름과 필드는 동일한 이름을 갖으며 이 관례로 인해 우선순위(필드 < 매개변수)가 낮은 필드에 접근 불가.
      이를 해결하기 위해, this 를 사용.

      public class Student {
      
          // 필드
          string name;
          int age;
      
          // 생성자
          public Student(string name, int age) {
              this.name = name; // this.필드 = 매개변수
              this.age = age;  // this.필드 = 매개변수
          }
      }
      
    • 생성자 오버로딩(Overloading)
      매개 변수를 달리하는 생성자를 여러 개 선언하는 것.
      public class Student {
        Student() { ... }
        Student(string name) { ... }
        Student(string name, int age) { ... }
      }
      
    • 다른 생성자 호출(this())
      생성자에서 다른 생성자를 호출할 때 this()를 사용.
      생성자의 첫줄에서만 허용되며, 중복 코드를 줄여줌.
      public class Student {
        string name;
        int age;
      
        Student(string name) {
            this(name, 20);
        }
            
        Student(string name, int age) {
            this.name = name;
            this.age = age;
        }
      }
      
  • 메소드
    객체의 동작에 해당하는 중괄호 {} 블록을 지칭.
    필드를 읽고 수정하는 역할과 다른 객체를 생성해서 다양한 기능을 수행하기도 함.

    • 선언
      메소드 선언부를 메소드 시그너처(signature)라고도 함.
      리턴타입, 메소드이름, 매개변수, 기능 을 작성.
      void EditStudent(string name, int age) { 
        ... 
      }
      
    • 매개 변수를 모를 경우
      매개 변수를 배열 타입 혹은 리스트 타입 으로 선언.
    /******** 배열 */
    // 선언
    int sum1(int[] values) { ... }
    
    // 호출
    int[] values = {1, 2, 3};
    int result = sum1(values);
    int result = sum1(int[] {1, 2, 4, 5});
    
    /******** 리스트 */
    // 선언
    int sum2(int ... values) { ... }
    
    // 호출
    int result = sum1(1,2,3);
    
    • 메소드 오버로딩
      같은 이름의 메소드를 여러개로 선언하는 것.

    조건: 매개 변수의 타입/개수/순서 중 하나가 달라야함.
    주의: 리턴 타입만 다르고 매개 변수가 동일할 경우는 컴파일 오류 발생.

참고 서적

이것이 자바다, 신용권 지음, 한빛미디어