05. OOP
OOP(Object Oriented Programming)
1. 객체지향언어
1) 정의
- 객체 : 자신의 속성과 기능이 있어 구분되어 질 수 있는 것
- 지향 : 어떠한 것을 목표로 하는 것
- 객체지향언어 : 현실세계는 물체와 개념 같이 독립되고 구분되는 객체로 이루어져 있고, 발생하는 사건들은 객체들 간의 상호작용이다. 이러한 개념을 컴퓨터로 옮겨 놓아 만들어 내는 것.
- 자바에서 객체란??
- 클래스에서 정의된 내용을 new 연산자를 통해 heap 메모리에 생성된 것
- 4요소 :
- 캡슐화
- 상속
- 다형성
- 추상화
2) 클래스
3) 추상화
- 정의
- 유연성을 위해 구체적인 것을 제거. 클래스의 속성과 기능 중 공통적인 것은 추출하고 불필요한 것은 제거하는 과정
- 장점 :
- 클래스 다이어그램
앞의 -, + 는 접근제한형을 private, public으로 하라는 의미.
데이터의 직접 접근 제한을 원칙으로 한다
=> 정보 은닉화, 보호화캡슐화 원칙
- 클래스의 멤버변수의 접근 제한은 private를 원칙으로 한다 (직접 접근 제한)
- 클래스 안에 멤버method를 만든다 (getter/setter) ( 간접 접근 )
- method의 접근제한은 public으로 한다.
- 클래스의 멤버변수의 접근 제한은 private를 원칙으로 한다 (직접 접근 제한)
5) 객체 할당(Instance)
- 정의
2. 클래스
1) 표시형태
- [접근제한자][예약어] class 클래스명{ } 2) 3요소
- 필드, 생성자, 메소드 3) 접근제한
- public
- 표기 - public class 클래스명
- 사용범위 - 전체
- (default)
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 사용
}
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;
}
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);
}