자바 객체지향 언어
- 코드 재사용성이 높다.
- 코드 관리가용이하다.
- 신뢰성이 높은 프로그래밍을 가능하게 한다.
객체 지향 프로그래밍
부품에 해당하는 객체를 먼저 만들고, 이걱들을 하나 씩 조립해서 완성된 프로그램을 만드는 기법
객체 간의 관계
객체 지향 프로그래밍 특징
- 캡슐화
객체의 필드, 메서드를 하나로 묶고, 실제 구현내용을 감추는 것
접근 제한자를 통해 구현
감추는(보호하는) 이유는 외부의 잘못된 사용으로 손상을 막기 위함
- 상속
상위 객체가 가진 필드와 메서드를 하위 객체에게 물려주는 것또한 상위 객체 변경이 하위 객체에게 영향을 미치므로 유지보수성도 상승 한다.
즉, 상위 객체를 재사용하여 빠른 설계와 코드 재사용성 상승으로 개발 효율이 올라간다.
- 다형성
같은 타입이지만 실행 결과가 다양한 객체를 이용할 수 있는 성질
부모 클래스(인터페이스) 타입으로 자식 객체를 다루는 것
- 추상화
공통된 성질을 뽑아 상위 타입으로 만든다.
클래스와 객체
클래스는 객체를 정의해 놓은 것
클래스는 객체를 생성하는데 사용된다.
new 연산자
new 연산자 뒤엔 반드시 생성자를 호출한다.
클래스에 new 연산자를 사용해 객체를 생성, 생성된 객체는 자바 heap 영역에 존재하며, 그 주소 값를 리턴한다.
객체의 구성요소
속성 - 멤버변수, 특성, 필드, 상태
기능 - 메서드 , 함수, 행위
클래스의 구성 멤버
필드
객체가 가져야할 데이터
상태, 정보, 다른 객체의 참조변수 등
생성자
new 연산자와 같이 사용되어 클래스로부터 객체를 생성할 때 호출되는 메서드
객체 초기화를 담당
heap영역에 생성 후 그 주소를 리턴
아무 것도 없을 시 컴파일러가 기본 생성자를 추가해준다.
즉, 명시적으로 다른 생성자를 만들었으면 기본생성자는 추가 안해준다
명시적 초기화 이유는 복잡 초기화를 위함이다.
메소드
객체에 동작에 해당
객체간 데이터 전달
필드 수정 등등
메소드 선언부 - 리턴타입, 메소드이름, 매개변수(파라미터) 선언
이를 시그니처(signature)라고도 한다.
클래스의 또 다른 정의
객체지향의 관점에서 클래스는 객체를 생성하기 위한 틀, 클래스는 속성과 기능으로 정의된다.
클래스를 바라보는 3가지 관점
- 설계도
- 데이터와 함수의 결합
- 사용자 정의 데이터 타입
변수와 메서드
선언위치 변수종류
클래스 변수, 인스턴스 변수, 지역변수 세 종류가 있다.
구분 방법은 선언 위치이다.
멤버 변수를 제외하고는 전부 지역 변수이며
그중 static이 붙은 것을 클래스 변수라 한다.
public class Variables {
int iv; //인스턴스 변수, 객체와 같은 생명주기 , 힙영역에 위치
static int cv;// 클래스 변수 JVM과 같은 생명 주기, 메서드 영역에 위치
void method() {
int lv = 0; //지역변수. 스택 영역에 위치
//지역변수는 선언과 동시에 초기화를 해줘야 한다.
}
}
1. 인스턴스 변수(instance variable)
클래스 영역에 선언
클래스의 인스턴스가 생성되었을 때 생성된다.
각각 독립적인 저장공간을 가진다.(서로 다른 값 가능)
인스턴스 마다 고유한 상태를 유지해야하는 경우 인스턴스 변수를 사용
객체가 제거 될 때 같이 소멸
2. 클래스 변수(class variable)
인스턴스 변수 앞에 static 키워드를 붙인 것
클래스가 메모리에 올라갈 때 생성되며, 인스턴스 생성 없이 바로 사용 가능
모든 인스턴스가 공통된 저장공간을 공유한다.
JVM이 종료될 때 같이 소멸
3. 지역 변수(local variable)
메서드 내에 선언, 메서드 내에서만 사용 가능
메서드 종료 시 같이 소멸
해당 블록에서만 유효 { }
클래스 변수 아무때나 사용가능하다.
프로그램 시작과 동시에 고정으로 생성되기 때문이다.
클래스 변수의 수정은 전역에 영향을 미친다.
클래스 변수의 초기화는 묵시적으로 가능하다.
클래스로부터 생성된 객체들이 공유하는 데이터를 클래스 멤버로 만든다.
하나의 메모리를 같이 공유(메서드 영역)
인스턴스 변수는 인스턴스가 생성돼야 사용 가능하다.
인스턴스는 힙영역에 동적으로 할당 되기 때문이다.
인스턴스 변수의 변화는 해당 인스턴스만 영향을 미친다.
인스턴스 변수의 초기화는 묵시적으로 가능하다.
필요한 필드나 메서드는 같지만 객체마다 서로 다른 값이 필요한 경우 인스턴스 멤버로 쓴다.
객체마다 별도의 데이터 공간이 할당된다(힙영역)
지역 변수는 메서드 구현부 블록 {} 안에서만 유효하다.
스택 영역에 저장되며 블록 {}을 벗어나면 소멸한다.
지역 변수의 변화는 해당 메소드에만 영향을 미친다.
지역 변수는 반드시 명시적 초기화를 해줘야 한다.
메서드
특정 작업을 수행하는 문장을 작업단위로 묶어서 이름을 붙인 것
값을 받아서 처리하고, 결과를 반환
중요한 것은 메서드가 어떤 작업을 수행하는 지 알 필요가 없다는 것이다.
즉, 메서드에 넣을 값(입력)과 결과(출력)만 알면 된다.
그래서 메서드를 내부가 보이지 않는 '블랙박스'라고도 한다.
메서드를 사용하는 이유 세 가지
높은 재사용성(reusability)
Java API에서 제공하는 메서드들을 생각해보자
한 번 만들어 놓으면 몇 번이고 다른 프로그램에서 사용이 가능하다.
중복된 코드 제거
반복되는 코드를 묶어서 하나의 메서드로 작성해 놓으면
반복되는 코드 대신 메서드 호출 한 번으로 대체가 가능하다.
즉, 코드량과 코드 유지보수성이 증가한다.
코드 변경에도 유리하다.
프로그램 구조화
main()메서드 안에 어플리케이션 코드를 다 집어넣을 수는 없다.
작업 단위로 나눠서 여러 개의 메서드에 담아 프로그램의 구조를 단순화 시키는 것이 필수적이다.
메서드의 선언과 구현
메서드는 크게 두 부분, 선언부와 구현부로 이뤄져 있다.
void method(){ // 이외 선언부, 선언부의 다른 이름 시그니처
/*{}속이 구현부*/
}
반복적으로 수행되는 여러 문장을 하나의 메서드로 작성
하나의 메서드는 한 가지 기능만을 수행하도록 작성(재사용, 이식성)
반환 값은 있을 수도 있고 없을 수도 있지만
반환 값이 있을 경우 반드시 1개만 반환한다.
만약 여러 개를 값을 반환하고 싶다면 배열이나 객체로 반환한다
리턴 값은 당연히 반환 타입과 일치해야한다.
모든 메서드는 반드시 하나의 return문이 있어야한다.
반환 값이 없는 void경우 컴파일러가 자동으로 추가해 준다.
메서드 선언부는 후에 변경사항이 발생하지 않도록 신중히 작성해야한다. 이 메서드를 호출하는 부분이 전부 변경되기 때문이다.