•
빠른 변화에 대한 해결책으로 객체지향 언어 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.channelDown(); //Tv인스턴스의 메서드 channelDown()을 호출한다
•
참조변수와 객체의 변수, 메서드는 주소값으로 연결되어 있다
•
사용할 수 없는 객체는 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{} → 생성자) 순서로 초기화 된다!!!