객체지향언어
- 특징
- 코드의 재사용성이 높다
- 코드 관리가 용이하다
- 신뢰성이 높은 프로그래밍이 가능하게 한다.
클래스와 객체
- 클래스
- 정의
- 객체를 정의해 놓은 것.
- 용도
- 객체를 생성하는데 사용.
- 객체
- 정의
- 실제로 존재하는 것(사물)
- 용도
- 기능과 속성에 따름
- 객체와 인스턴스화
- 클래스를 인스턴스화 하여 인스턴스를 만드는 것을 인스턴스화라고 한다.
- 객체의 구성요소 (속성과 기능)
- 멤버(member)
- 객체가 가지고 있는 속성과 기능을 그 객체의 멤버라고 함.
- 인스턴스 생성과 사용
- Tv클래스 타입의 참조변수 t를 선언한다. 메모리에 참조변수 t를 위한 공간이 마련됨.
Tv t;
- Tv클래스의 인스턴스가 new 연산자에 의해 생성, 이 후 대입연산자를 통해 주소를 t에 저장.
t = new Tv();
- 참조변수 t에 있는 인스턴스 멤버변수 channel에 7을 저장.
t.channel = 7;
- Tv 클래스에 있는 chnnelDown 메서드 호출
t.channelDown();
변수와 메서드
- 선언위치에 따른 변수와 종류
변수의 종류 | 선언위치 | 생성시기 |
클래스 변수 (class variable) |
클래스 영역 | 클래스가 메모리에 올라갈 때 |
인스턴스 변수 (instance variable) |
인스턴스가 생성이 될 때 | |
지역 변수 (local variable) |
클래스 영역 이외의 영역 (메소드, 생성자, 초기화 블록 내부) |
변수 선언문이 수행이 될 때 |
- 인스턴스 변수
- 독립적인 저장공간을 가짐(서로 다른 값을 가질 수 있음)
- 클래스 변수
- 인스턴스 앞 static을 붙임. 공통으로 사용되는 값에 사용됨.
- 지역변수
- 메서드 내에 선언되어 메서드 내에서 사용가능
- 메서드가 종료가 되면 자동으로 소멸됨.
- 메소드(method)
- 특정 작업을 수행하는 일련의 문장들을 하나로 묶은 것.
- 메서드를 사용하는 이유
- 높은 재사용성
- 중복된 코드의 제거
- 프로그램의 구조화
- 메서드 선언과 구현
- 메서드 선언부
- 반환타입이 없는 것은 void타입을 입력
int add (int x, int y) { // 반환타입 메서드이름 매개변수
int result = x + y;
return result; // 결과를 반환
}
- 메서드 구현부
- {}안에 메서드를 호출 했을 때 수행할 문장을 입력
- Return 문
- 이 값의 타입은 반환타입과 일치하거나 적어도 자동 형변환이 가능한 것.
- 지역변수
- 메서드 내에 선언된 변수들을 지역변수라고 함.
int add(int x, int y) { // x, y는 지역변수
int result x=y; // result 지역변수
return result;
}
- 메서드의 호출
- 인자와 매개변수
- 인자(인수)
- 메서드를 호출 할 때 괄호() 안에 지정한 값.
- 인자의 개수와 순서는 호출 된 메서드에 선언된 매개변수와 일치해야 함.
- 매개변수의 타입과 일치하거나 자동 형변환이 가능한 것.
- 메서드의 실행흐름
- 같은 클래스 내의 메서드끼리는 참조변수를 사용하지 않고도 서로 호출 가능.
- static메서드는 같은 클래스 내의 인스턴스 호출불가.
- 메서드가 호출되면 지금까지 실행 중이던 메서드는 실행을 잠시 멈추고 호출된 메서드의 문장을 수행.
- Return 문
- void
- return문이 없어도 컴파일러가 자동적으로 return을 입력해줌.
- 그 외
- 반드시 return 문이 있어야함.
- 반환값(return value)
- 변수가 아닌 수식이 올 수 있음.
int add (int x, int y) { result x + y; }
- 매개변수 유효성검사
- 입력된 값이 매개변수와 같은 타입이 아닐 수도 있으니 메서드 내에 이러한 오류를 걸러낼 수 있도록 설계
float divide(int x, int y) {
if(y==0) {
Sysytem.out.println("0으로 나눌 수 없습니다.");
return 0;
}
return x / (float) y;
}
- JVM 메모리 구조
- 메서드 영역(method area)
- 프로그램 실행 중 어떤 클래스를 사용하면 해당 클래스의 클래스파일을 읽어 분석.
- 이때 클래스의 클래스변수도 이 영역에 함께 생성된다.
- 힙(heap)
- 인스턴스가 생성되는 공간.
- 프로그램 실행 중 생성되는 인스턴스는 모두 이곳에 생성됨.
- 호출스택(call stack)
- 호출스택은 메서드의 작업에 필요한 메모리 공간을 제공
- 메서드가 작업을 수행하는 동안 지역변수(매개변수 포함)들과 연산의 중간결과 등을 저장하는데 사용됨.
- 호출스택의 가장 위에 있는 메서드가 현재 실행 중인 메서드이다.
- 아래에 있는 메서드가 바로 위의 메소드를 호출한 메서드이다.
- 기본형 매개변수와 참조형 매개변수
- 기본형
- 변수의 값을 읽기만 할 수 있다.
class Data { int x; }
class PrimitiveParamEx {
public static void main (String[] args) {
Data d = new Data();
d.x = 10;
System.out.println("x : " + d.x); // 10
change(d.x); // 1000
System.out.println("x : " + d.x); // 10
}
static void change(int x) { // 기본형 매개변수
x = 1000;
}
}
- 참조형
- 변수의 값을 읽고 변경 할 수 있다. (read & write)
class Data { int x; }
class PrimitiveParamEx {
public static void main (String[] args) {
Data d = new Data();
d.x = 10;
System.out.println("x : " + d.x); // 10
change(d); //
System.out.println("x : " + d.x); // 1000
}
static void change(Data d) { // 참조형 매개변수
d.x = 1000;
}
}
- 참조형 반환타입
- 반환타입이 참조형이라는 것은 메서드가 객체의 주소를 반환한다는 것을 의미한다.
class Data { int x; }
class PrimitiveParamEx {
public static void main (String[] args) {
Data d = new Data();
d.x = 10;
Data d2 = copy(d);
System.out.println("d : " + d.x); // 10
System.out.println("d2 : " + d.x); // 1000
}
static Data copy(Data d) { // 참조형 매개변수
Data tmp = new Data();
tmp.x = d.x;
return tmp;
}
}
- 재귀호출(recursive call)
- 메서드의 내부에서 메서드 자신을 다시 호출하는 것을 재귀호출이라고 한다.
- 재귀호출을 하는 메서드를 재귀 메서드라고 한다.
- 클래스 메서드와 인스턴스 메서드
- 멤버변수 중 모든 인스턴스에 공통으로 사용하는 것에 static을 사용.
- class 변수는 인스턴스를 생성하지 않아도 사용가능.
- class 메서드는 인스턴스 변수를 사용하지 못함.
- 메서드 내에 인스턴스 변수를 사용하지 않는 다면 static을 고려
- 클래스 멤버와 인스턴스 멤버간의 참조와 호출
- 클래스 멤버에서 인스턴스 멤버 변수 호출이 불가한 이유
- 인스턴스 멤버가 존재하는 시점에 클래스 멤버는 항상 존재하지만 반대로는 없을 수 있기 때문이다.
오버로딩(overloading)
- 같은 이름을 가진 메서드가 있더라도 매개변수의 개수 또는 타입이 다르면, 같은 이름으르 사용해서 메서드를 지정이 가능함.
- 조건
- 메서드의 이름이 같아야 한다.
- 매개변수의 개수 또는 타입이 달라야 한다.
- 반환타입이 오버로딩을 구현하는데 아무런 영향을 주지 않는다.
int add(int a, int b) {return a+b;}
long add(long a, long b) {return a+b;}
long add(int[] a) {[
long result = 0 ;
for(int i=0; i < a.length ; i ++ ) {
result += a[i];
}
return result;
}
생성자(contructor)
- 인스턴스가 생성 될 때 호출되는 '인스턴스 초기화 메서드' 이다.
- 조건
- 생성자의 이름은 클래스 이름과 같아야 한다.
- 생성자는 리턴 값이 없다.
- 연산자 new가 인스턴스를 생성하는 것이지 생성자가 인스턴스를 생성하는 것이 아니다.
- 기본 생성자
- 기본 생성자가 컴파일러에 의해서 추가되는 경우는 클래스에 정의된 생성자가 없을 때 뿐이다.
- 매개변수가 있는 생성자
Car c = mew Car();
c.color = "white";
c.gearType = "auto";
c.door = 4;
// 아래 한줄 코드로 처리가 가능함.
Car c = new Car("white","auto",4);
- 생성자에서 다른 생성자 호출하기
- 생성자의 이름으로 클래스의 이름 대신 this를 사용.
- 한 생성자에서 다른 생성자를 호출 시 반드시 첫 죽에서 호출.
- this()는 다른 생성자를 호출.
- this는 클래스 내에 있는 인스턴스 호출.
- 생성자를 이용한 인스턴스 복사
Car(Car c) {
color = c.color;
gearType = c.gearType;
door = c.door;
}
변수의 초기화
- 클래스 변수
- 초기화 시점
- 클래스가 처음 로딩될 때 단 한번 초기화
- 초기화 순서
- 기본값 >> 명시적 초기화 >> 초기화 블록
- 인스턴스 변수
- 초기화 시점
- 인스턴스가 생성될 때 초기화
- 초기화 순서
- 기본값 >> 명시적 초기화 >> 초기화 블록 >> 생성자
'Language > Java' 카테고리의 다른 글
Chapter 14. 스트림(stream) (0) | 2022.11.30 |
---|---|
Chaper 14. 람다식 (0) | 2022.11.30 |
컬렉션(Collection)과 제네릭(Generic) (2) (0) | 2022.11.28 |
컬렉션(Collection)과 제네릭(Generic) (1) (0) | 2022.11.28 |
예외처리 (0) | 2022.11.28 |