Search

자바의 정석 Chapter 6 : 객체지향 개념

빠른 변화에 대한 해결책으로 객체지향 언어 1996년 도입
코드의 재사용성이 높고 유지보수가 용이, 중복 코드 제거
객체지향 언어 = 프로그래밍 언어 + 객체지향개념(규칙)
OOP(Object-Oriented Programming)
1.
캡슐화
2.
상속
3.
추상화
4.
다형성
클래스와 객체
클래스의 정의 : 객체를 정의해 놓은 것
클래스의 용도 : 객체를 생성하는데 사용
객체의 정의 : 실제로 존재하는 것. 사물 또는 개념
객체의 용도 : 객체가 가지고 있는 기능과 속성에 따름
객체 = 속성(변수) + 기능(메서드)
객체와 인스턴스 (같다..)
객체 : 모든 인스턴스를 대표하는 일반적 용어
인스턴스 : 특정 클래스로부터 생성된 객체
하나의 소스파일에 여러 클래스 작성
Good Practice
public class가 있는 경우!! 소스 파일의 이름은 반드시 public class의 이름과 일치해야함!!!!
public class가 하나도 없는 경우!! 소스 파일의 이름은 아무거나 사용 가능!!!
Bad Practice
하나의 소스 파일에 둘 이상의 public class가 존재
소스 파일의 이름이 public class와 일치하지 않음
소스 파일의 이름과 public class의 이름이 대문자와 소문자로 다르다!! (대소문자까지 일치해야함)
객체의 생성과 사용
객체의 생성
Tv t; //클래스의 객체를 참조하기 위한 참조변수 선언
t = new Tv(); //클래스의 객체를 생성 후 객체의 주소를 참조변수에 저장
객체의 사용
t.channel = 7; //Tv인스턴스의 멤버변수 channel의 값을 7로 한다
t.channelDown(); //Tv인스턴스의 메서드 channelDown()을 호출한다
System.out.println(”현재 채널은 “ + t.channel + “ 입니다.”);
참조변수와 객체의 변수, 메서드는 주소값으로 연결되어 있다
사용할 수 없는 객체는 GC가 청소해서 메모리 정리를 해줌
하나의 인스턴스를 여러 개의 참조변수가 가리키는 경우(가능)
여러 인스턴스를 하나의 참조변수가 가리키는 경우(불가능)
객체 배열
Tv[] tvArr = new Tv[3];
Tv[] tvArr = { new Tv(), new Tv(), new Tv() };
클래스의 정의
설계도
클래스 == 데이터 + 함수
1.
변수 : 하나의 데이터를 저장할 수 있는 공간
2.
배열 : 같은 종류의 여러 데이터를 하나로 저장할 수 있는 공간
3.
구조체 : 서로 관련된 여러 데이터(종류 관계X)를 하나로 저장할 수 있는 공간
4.
클래스 : 위와 같은 데이터와 함수의 결합(구조체 + 함수)
사용자 정의 타입
class Time {
int hour;
int minute;
int second;
}
선언위치에 따른 변수의 종류
static이 붙어야 클래스 변수고 아무 때나 쓸 수 있다
class 영역에서 static이 없는건 인스턴스 변수고 인스턴스가 생성되면 쓸 수 있다
메서드 영역에서 선언된건 지역 변수 (메서드 종료 시 제거)고 메서드가 작동하는 동안 쓸 수 있다
메서드의 매개 변수 또한 지역 변수이다
클래스 변수와 인스턴스 변수
클래스 변수 : 객체들의 공통적인 변수고 클래스 이름으로 사용
인스턴스 변수 : 객체들마다 개별적인 변수고 참조변수 이름으로 사용
메서드란?
문장들을 묶은 것으로 작업 단위다
반복적으로 수행되는 여러 문장을 메서드로 작성한다
하나의 메서드는 한 가지 기능만 수행하도록 작성한다
값(입력)을 받아서 처리하고 결과를 반환(출력)한다
메서드는 클래스 안에 있어야 하지만 함수는 클래스에 독립적이다
void 형식일 경우 return을 생략할 수 있다
반환값은 반환값을 담을 변수와 타입이 일치하거나 자동 형변환이 가능해야 한다
메서드명은 주로 동사
메서드의 장점
코드의 중복을 줄일 수 있다
코드의 관리가 쉽다
코드를 재사용할 수 있다
코드가 간결해서 이해하기 쉬워진다
호출 스택(call stack)
메서드 수행에 필요한 메모리가 제공되는 공간
메서드가 호출되면 호출스택에 메모리 할당, 종료되면 해제
아래 있는 메서드가 위의 메서드를 호출한 것
맨 위에 메서드 하나만 실행 중이고 나머지는 대기 중
매개변수
기본형 매개변수 : 변수의 값을 읽기만 할 수 있다 (read only)
참조형 매개변수 : 변수의 값을 읽고 변경할 수 있다 (read & write)
인스턴스 메서드
인스턴스 생성 후 ‘참조변수.메서드이름()’으로 호출
인스턴스 멤버(iv, im)와 관련된 작업을 하는 메서드
메서드 내에서 인스턴스 변수(iv) 사용 가능
static 메서드(클래스 메서드)
객체생성 없이 ‘클래스이름.메서드이름()’으로 호출
인스턴스 멤버(iv, im)와 관련없는 작업을 하는 메서드
메서드 내에서 인스턴스 변수(iv), 인스턴스 메서드 사용 불가
(static은 항상 호출되지만 인스턴스는 객체가 없을 수 있어서)
메서드를 만들고 iv를 사용하지 않을 때 static을 붙인다
오버로딩
한 클래스 안에 같은 이름의 메서드를 여러 개 정의하는 것
ex) println ← 타입이 달라도 문제 없음
오버로딩이 성립하기 위한 조건
1.
메서드 이름이 같아야 한다
2.
매개변수의 개수 또는 타입이 달라야 한다
3.
반환 타입은 영향이 없다
ambiguous → 오버로딩으로 만든 메서드 중 어떤걸 사용할지 명학하게 알려주지 않았을 때 나는 에러
생성자(constructor)
클래스를 만들 땐 꼭 생성자를 만들기!!!
인스턴스가 생성될 때마다 호출되는 ‘인스턴스 초기화 메서드’
인스턴스 생성 시 초기화뿐만 아니라 수행할 작업도 가능
Time t = new Time(12, 34, 56);
생성자 생성 조건
1.
이름이 클래스 이름과 같아야 한다
2.
리턴값이 없다 (void 안붙임)
3.
모든 클래스는 반드시 한 개 이상 생성자를 가져야 한다
기본 생성자
매개변수가 없는 생성자
생성자가 하나도 없을 때만 컴파일러가 자동으로 추가
클래스이름() { }
매개변수가 있는 생성자
생성자 this()
생성자에서 다른 생성자 호출할 때 사용
다른 생성자 호출 시 첫 줄에서만 사용 가능
같은 클래스에서 생성자를 호출 할 땐 this()로 사용
참조변수 this
인스턴스 자신을 가리키는 참조변수
인스턴스 메서드, 생성자에서 사용가능
지역 변수와 인스턴스 변수를 구별할 때 사용
같은 클래스에선 생략 가능
지역 변수의 초기화
사용전 꼭!!!!! 수동 초기화 해야 함
자료형의 기본값
멤버변수(iv, cv)의 초기화
자동 초기화 (멤버변수는 자동 초기화가 기본)
명시적 초기화(=)
초기화 블럭 (cv일 때 주로 사용(
생성자 (iv일 때 주로 사용)
cv → iv 순서로 초기화 된다!!!
자동 → 간단 → 복잡(static{} → 생성자) 순서로 초기화 된다!!!