포스트

05. OOP

OOP(Object Oriented Programming)

1. 객체지향언어

1) 정의

  • 객체 : 자신의 속성과 기능이 있어 구분되어 질 수 있는 것
  • 지향 : 어떠한 것을 목표로 하는 것
    • 객체지향언어 : 현실세계는 물체와 개념 같이 독립되고 구분되는 객체로 이루어져 있고, 발생하는 사건들은 객체들 간의 상호작용이다. 이러한 개념을 컴퓨터로 옮겨 놓아 만들어 내는 것.
  • 자바에서 객체란??
    • 클래스에서 정의된 내용을 new 연산자를 통해 heap 메모리에 생성된 것
  • 4요소 :
    • 캡슐화
    • 상속
    • 다형성
    • 추상화

2) 클래스

  • 정의
    • 객체의 속성과 기능에 대해 정의한 것
  • 필수요소
    • 캡슐화, 추상화의 적용
  • 등장배경

3) 추상화

  • 정의
    • 유연성을 위해 구체적인 것을 제거. 클래스의 속성과 기능 중 공통적인 것은 추출하고 불필요한 것은 제거하는 과정
  • 장점 :
    • 코드의 중복 감소 -> 유지 및 보수 효율 증진
    • 코드의 유연성 증가
    • 코드의 재사용성 증가
      1
      2
      
      국민 정보 관리 프로그램 - 국민 한 사람의 정보(속성)을 추상화한다면?
      : 5천만명의 변수를 생성하고 만들 수 없으므로 공통적인 속성을 만들고 각각의 정보를 넣어서 사용한다.
      

  • 클래스 다이어그램
    앞의 -, + 는 접근제한형을 private, public으로 하라는 의미.

4) 캡슐화

  • 데이터의 직접 접근 제한을 원칙으로 한다
    => 정보 은닉화, 보호화

  • 캡슐화 원칙

    • 클래스의 멤버변수의 접근 제한은 private를 원칙으로 한다 (직접 접근 제한)
    • 클래스 안에 멤버method를 만든다 (getter/setter) ( 간접 접근 )
    • method의 접근제한은 public으로 한다.

5) 객체 할당(Instance)

  • 정의
    • new 연산자를 통해 heap 메모리에 생성된 것
      1
      2
      3
      4
      
      Student 김철수 = new Student(); ⇒ 인스턴스하여 김철수라는 객체를 만듦
      getter/setter를 이용하여 김철수 인스턴스의 멤버변수 출력 및 수정
      Student 김영희 = new Student();
      getter/setter를 이용하여 김영희 인스턴스의 멤버변수 출력 및 수정
      

2. 클래스

1) 표시형태

  • [접근제한자][예약어] class 클래스명{ } 2) 3요소
  • 필드, 생성자, 메소드 3) 접근제한
  • public
    • 표기 - public class 클래스명
    • 사용범위 - 전체
  • (default)
    • 표기 - class 클래스명
    • 사용범위 - 같은 패키지 내

3. 필드

1) 정의

  • 클래스에서 변수와 관련된 속성을 작성하는 곳

2) 멤버 변수( == 필드에 쓰인 변수, 객체의 속성)

  • 인스턴스 변수(iv)
    • 필드에 작성된 일반 변수
    • heap 영역에 메모리가 할당
    • 객체가 생성될 때 마다 생성
    • 객체가 참조하는 변수가 없을 때 사라짐
    • new 연산자에 의해서 객체가 생성될 때 메모리에 할당된다고 해서 인스턴스 변수라고 함
  • 클래스 변수(cv, static 변수)
    • 필드에 static 예약어와 함께 작성된 변수
    • static 영역에 메모리가 할당
    • 프로그램 실행 시 1회만 생성되는 변수
    • 프로그램 실행 시 static 메모리에 자동 할당되며, 프로그램 종료 시 자동 소멸
  • 지역 변수(lv) (멤버변수가 아님)
    • 메소드 또는 제어문 안에서 선언된 변수
    • stack 메모리 영역에 할당 되었다가, 메소드 종료시 소멸됨

3) 표현식

1
2
3
4
5
6
7
8
9
10
11
<표현식>
[접근제한자] [예약어] class 클래스명 { // 클래스 표현식
  [접근제한자] [예약어] 자료형 변수명 [= 초기값];	// 필드 표현식
}

public class Academy { 
  public int temp1;
  protected int temp2;
  int temp3; 		//접근제한자 생략 시 (default)
  private int temp4; 	//캡슐화 원칙으로 private 사용
}

4) 접근제한자

5) 예약어

1
2
3
4
5
6
7
<static(->cv)>
* 같은 타입의 여러 객체가 공유할 목적의 필드에 사용
* 프로그램 시작시 static 영역에 자동으로 할당되는 멤버에게 적용

public class Academy { 
  private static int temp1;
}
1
2
3
4
5
6
7
8
<final(->상수)>
* 하나의 값만 계속 저장해야 하는 변수에 사용

public class Academy { 
  private final int TEMP1 = 100; 
  // final 키워드가 붙은 필드명은 모두 대문자로 표기
  private int temp4;
}

6) 필드 초기화 순서

4. 생성자

1) 정의

  • new 연산자를 통해 객체가 만들어 질 때 필드 초기화 + 필요 기능 수행
  • 생성자는 일종의 메소드이다

2) 규칙

  • 생성자명은 클래스명과 반드시 동일해야 한다.
  • 반환형(void, int ..)이 존재하지 않는다.

3) 표현식

  • 기본생성자
    [접근제한자] 클래스명(){….};
    • 컴파일러가 자동으로 기본 생성자 생성
  • 매개변수생성자
    [접근제한자] 클래스명 (매개변수) { this.필드명 = 매개변수; };
    • 객체 생성시 전달 받으 값으로 초기화
    • 매개변수 생성자 작성시 컴파일러가 기본 생성자 생성 X
    • 상속에서는 반드시 기본 생성자 사용
    • 오버로딩을 이용하여 작성
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[접근제한자] [예약어] class 클래스명 {
  [접근제한자] 클래스명() { } 
  [접근제한자] 클래스명(매개변수) { (this.)필드명 = 매개변수; } 
}

public class Academy {
  // 필드
  private int studentNo;
  private String name;

  // 생성자
  public Academy() {} // 기본 생성자
  public Academy(int studentNo, String name) { //매개변수 있는 생성자
    this.studentNo = studentNo;
    this.name = name;
  }
}
1
2
3
4
우리가 클래스를 참조하여 객체를 생성할 
ex) Class = Student
Student std1 = new Student(); 	//여기서 우측의 Student()가 생성자이다
// 기본생성자의 형태이고, 매개변수 생성자의 경우 new Studemt(매개변수) 이다

4) 오버로딩

  • 정의
    • 하나의 클래스에 동일한 이름으로 여러개의 메소드 작성
  • 조건
    • 메소드명이 동일해야 한다.
    • 매개변수의 자료형 or 개수 or 순서가 달라야 한다.
    • 반환값은 상관이 없다.

5) this. 참조 변수

  • 정의
    • 객체가 자기 자신을 참조할 수 있도록 하는 변수
    • 모든 객체 내부에 숨겨져 있다
  • 사용 이유
    • 필드명과 매개변수명이 같을 경우 둘을 구분하기 위해 주로 사용
1
2
3
4
5
6
7
8
9
10
11
public class Academy {
  private String name;	

  public Academy() { }

  public Academy(String name) { 
    this.name = name; 
  }	
}

여기서 this.name은 필드의 name을 가리키고, 대입하는 name은 매개변수로 받는 name을 가리킨다.

5. 메소드

1) 정의

  • 전달값이 없는 상태로 혹은 어떤 값을 전달하여 호출
  • 함수내에 작성된 연산에 따라 결과값 또는 반환값이 있을 수도 없을 수도 있음.

2) 표현식

1
2
3
4
5
[접근제한자] [예약어] 반환형 메소드명([매개변수]){ 기능정의 }

public void information() {
  System.out.println(studentNo);
}

3) 접근제한자

4) 예약어