1. 객체지향언어
2. 클래스와 객체
(1) 클래스 : 객체를 정의해 놓은것
-용도 : 객체를 생성하는데 사용
객체란? 실제로 존재하는 것. 사물 또는 개념 -> 클래스에 정의된 내용대로 메모리에 생성된 것
클래스와 객체의 관계 = 제품 설계도와 제품
클래스는 단지 객체를 생성하는데 사용될 뿐, 객체 그 자체는 아님
(2) 객체와 인스턴스
인스턴스화 : 클래스로부터 객체를 만드는 과정
- 어떤 클래스로부터 만들어진 객체 : 그 클래스의 인스턴스
인스턴스 < 객체 : 객체가 more General !
(3)객체의 구성요소 : 속성과 기능
속성(Attribute) = 맴버변수, 특성, 필드, 상태 기능(Method) = 매서드, 행위, 함수 |
(4) 인스턴스의 생성과 사용
클래스명 (참조)변수명; 변수명 = new 클래스명(); |
인스턴스의 맴버변수(속성)을 사용하려면, 참조변수.맴버변수 로 표현하면 된다.
인스턴스는 참조변수를 통해서만 다룰수 있으며, 참조변수의 타입은 인스턴스의 타입과 일치해야한다.
참조변수에는 하나의 값(주소)만이 저장될 수 있으므로 둘 이상의 참조변수가 하나의 인스턴스를 가르키는(참조하는) 것은 가능하지만 하나의 참조변수로 여러 개의 인스턴스를 가리키는 것은 가능하지만 하나의 참조변수로 여러 개의 인스턴스를 라리키는 것은 가능하지 않다.
(5) 클래스의 또 다른 정의
프로그래밍적인 관점에서의 클래스의 정의와 의미
변수 : 하나의 데이터를 저장할 수 있는 공간 배열 : 같은 종류의 여러 데이터를 하나의 집합으로 저장할 수 있는 공간 구조체 : 서로 관련된 여러 데이터를 종류에 관계없이 하나의 집합으로 저장할 수 있는 공간 |
3. 변수와 매서드
(1) 선언위치에 따른 변수의 종류
class Variables
{
int iv; // 인스턴스 변수 - 맴버변수
static int cv; // 클래스변수 - 맴버변수
void method()
{
int lv = 0; // 지역변수
}
}
변수의 종류 | 인스턴스변수 | 클래스변수 | 지역변수 |
선언위치 | 클래스영역 | 클래스영역 | 클래스영역 이외의 영역 |
생성시기 | 클래스가 메모리에 올라갈 떄 | 인스턴스가 생성되었을 때 | 변수 선언문이 수행되었을 때 |
내 용 | 인스턴스마다 고유한 상태를 유지해야하는 속서으이 경우, 인스턴스 변수로 선언 인스턴스마다 독립적인 저장공간을 갖는다. | 한 클래스의 모든 인스턴스들이 공통적인 값을 유지해야하는 속성의 경우 클래스변수로 선언, 모든 인스턴스가 공통된 저장공간(변수)를 공유 static + 인스턴스변수의 형태 인스턴스를 사용하지 않고 클래스이름.클래스변수 형식으로 바로 사용 public을 붙이면 프로그램 어디에서나 접근할 수 있는 전역변수의 성질을 가짐 | 메서드 안에서 선언되어 메서드 내에서만 사용 가능. 메서드 종료와 함께 소멸되어 이후 사용이 불가 |
(2) 클래스 변수와 인스턴스 변수
인스턴스변수는 인스턴스가 생성될 때 마다 생성되므로 인스턴스마다 각기 다른 값을 유지할 수 있지만, 클래스 변수는 모든 인스턴스가 하나의 저장공강을 공유하므로, 항상 공통된 값을 갖는다.
(3)매서드
리턴타입 메서드이름 (타입 변수명, 타입 변수명, . . .)
{
//메서드 호출 시 수행될 코드
}
메서드는 크게 선언부와 구현부로 나누어져 있다. 선언부에는 리턴타임, 메서드이름, 매개변수를 선언하고, 구현부에는 메서드가 호출 시 수행될 코드를 넣는다.
(4) return문
return문은 현재 실행 중인 메서드를 종료하고 호출한 메서드로 되돌아가게 한다.
1. 반환 값이 없는 경우 : return문만 써주면 된다.
2. 반환 값이 있는 경우 : return + 반환값을 지정해주어야 한다.
반환값은 메서드 선언부에 정의된 반환타입과 일치하거나 반환타입으로 자동형변환이 가능한 것이어야 한다.
(5) 매서드의 호출
참조변수.매서드이름();
참조변수.매서드이름(값1, 값2, . . . );
*같은 클래스 내의 매서드끼리는 참조변수를 사용하지 않고도 서로 호출이 가능하지만 static매서드는 같은 클래스 내의 인스턴스 메서드를 호출할 수 없다.
(6)JVM의 메모리 구조
Method Area(메서드 영역) : class의 정보 저장 -프로그램 실행 중 어떤 클래스가 사용되면, JVM은 해당 클래스의 클래스파일(*class)을 읽어서 분석하여 클래스에 대한 정보(클래스 데이터)를 이곳에 저장한다. 이 때, 그 클래스의 클래스 변수도도 이영역에 함께 생성된다. |
Call Stack(호출스택) : main관련 정보 - 호출스택은 메서드의 작업에 필요한 메모리 공간을 제공한다. 메서드가 호출되면 호출스택에 호출된 메서드를 위한 메모리가 할당되며, 이 메모리는 메서드가 작업을 수행하는 동안 지역변수(매개변수 포함)들과 연산의 중간결과 등을 저장하는데 사용된다. 그리고 메서드가 작업을 마치면 할당되었던 메모리 공간은 반환되어 비워진다. - 메서드가 호출되면 수행에 필요한 만큼의 메모리를 스택에 할당받는다. - 메서드가 수행을 마치고나면 사용했던 메모리를 반환하고 스택에서 제거된다. - 호출스택의 제일 위에 있는 메서드가 현재 실행 중인 메서드이다. - 아래에 있는 메서드가 바로 위의 메서드를 호출한 메서드이다. |
Heap(힙) : 동적생성으로 인스턴스 저장 - 인스턴스가 생성되는 공간, 프로그램 실행 중 생성되는 인스턴스는 모두 이곳에 생성된다. 즉 인스턴스변수들이 생성되는 공간이다. |
(7)기본형 매개변수와 참조형 매개변수
기본형 매개변수 : 기본형 값이 복사, 변수의 값을 읽기만 할 수 있다.
참조형 매개변수 : 인스턴스의 주소가 복사, 변수의 값을 일고 변경할 수 있다.
(8) 재귀호출
재귀호출 : 메서드의 내부에서 메서드 자기 자신을 다시 호출하는 것
(9) 클래스매서드와 인스턴스매서드
클래스메서드 : static + 메서드, 객체 생성없이 '클래스이름.메서드이름(매개변수)'로 호출 가능
인스턴스와 관계없는(인스턴스변수나 인스턴스메서드를 사용하지 않는) 메서드를 클래스메서드로 정의
인스턴스메서드 : 인스턴스변수와 관련된 작업을 하는, 즉 메서드의 작업을 수행하는데 인스턴스변수를 필요로 하는 메서드
1. 클래스를 설계할 때 , 맴버변수 중 모든 인스턴스에 공통적으로 사용해야하는 것에 static을 붙인다.
2. 클래스변수는 인스턴스를 생성하지 않아도 사용될 수 있다.
3. 클래스메서드는 인스턴스변수를 사용할 수 없다.
4. 메서드 내에서 인스턴스변수를 사용하지 않는다면, static을 붙이는 것을 고려한다.
(10) 클래스맴버와 인스터스맴버간의 참조와 호출
같은 클래스에 속한 맴버들 간에는 별도의 인스턴스를 생성하지 않아도 서로 참조/호출이 가능
단, 클래스맴버가 인스턴스맴버를 참조 또는 호출하고자 하는 경우에는 인스턴스를 생성해야함
-> 인스턴스맴버가 존재할 경우 클래스맴버는 항상 존재하지만 역의 경우 존재 할 수 도 있고 안 할 수 도 있기 때문
4. 메서드 오버로딩
(1)매서드 오버로딩이란?
메서드 오버로딩 : 한 클래스 내에 같은 이름의 메서드를 여러개 정의하는 것. (하나의 메서드 이름으로 여러기능을 구현)
(2)오버로딩의 조건
1. 메서드의 이름이 같아야 한다.
2. 매개변수의 개수 또는 타입이 달라야 한다.
3. 매개변수는 같고 리턴타입이 다른 경우에는 오버로딩이 성립되지 않는다. (리턴타입은 아무 영향 없음)
(3)오버로딩의 예
대표적인 예 : println메서드
void println() void println(boolean x) void println(char x) void println(char[] x) void println(double x) void println(float x) void println(int x) void println(Object x) void println(String x) |
매서드 이름 : println
매개변수의 개수 or 타입 : 다양
메개변수는 x로 동일
(4) 오버로딩의 장점
근본적으로 같은 기능을 하는 메서드들이지만 서로 다른 이름을 갖기에 작성하기 불편, 따라서 오버로딩을 사용하면
1.오류의 가능성을 많이 줄일 수 있다.
2.메서드 이름만 보고도 그 기능을 예측할 수 있다.
3. 메서드의 이름을 절약할 수 있다
5. 생성자
(1)생성자란?
생성자 : 인스턴스가 생성될 때 호출되는 '인스턴스 초기화(인스턴스변수들의 초기화) 메서드'
1.생성자의 이름은 클래스의 이름과 같아야한다
2. 생성자는 리턴값이 없다(그렇다고 void를 적지 않는다)
- 클래스 내에 선언 , 매서드와 구조가 유사
- 생성자도 오버로딩이 가능
클래스이름(타입 변수명, 타입 변수명, . . . ) {
//인스턴스 생성시 수행될 코드,
// 주로 인스턴스 변수의 초기화 코드를 적는다.
}
생상자로 인해 인스턴스가 생성된다? NO -> 연산자 new로 인해 인스턴스가 생성
Card c = new Card(); |
1. 연산자 new에 의해서 heap영역에 Card클래스의 인스턴스가 생성된다.
2. 생성자 Card()가 호출되어 수행된다.
class Card {
* 매개 변수가 없는 생성자
Card() { . . . }
*매개 변수가 있는 생성자
Card(String k, int num) { . . . }
}
3. 연산자 new의 결과로, 생성된 Card인스턴스의 주소가 반환되어 참조변수 c에 저장된다.
(2) 기본 생성자
모든 클래스에는 반드시 하나 이상의 생성자가 정의되어야 한다.
But 클래스에 생성자를 정의 하지 않도고 인스턴스를 생성할 수 있었던 이유 : 컴파일러가 기본생성자를 제공하기 때문
클래스이름() { }
Card() { }
기본 생성자가 컴파일러에 의해서 추가되는 경우는 클래스에 정의된 생성자가 하나도 없을 때 뿐이다.
(3) 매개변수가 있는 생성자
class Car { String color; String gearType; int door; Car() { } // 매개변수가 없는 생성자 Car(String c, String g, int d) { // 매개변수가 있는 생성자. color = c; gearType = g; door = d; } } |
*생성자 Car()를 이용 할 경우, 인스턴스 생성시 인스턴스변수들을 초기화해주어야 한다
Car c= new Car();
c.color = "White";
c.gearType = " auto";
c.door = 4;
*매개변수가 있는 생성자 Car(String c, String g, int d)를 사용할 경우, 인스턴스 생성과 동시에 초기화 가능
Car c = new Car("White", "auto" , 4);
(4)생성자에서 다른 생성자 호출하기 : this(), this
생성자 간에 호출 가능
- 생성자의 이름으로 클래스이름 대신 this를 사용한다.
- 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출이 가능하다.
|
this는 참조변수, 자기 자신을 가리킨다. 인스턴스의 주소가 저장
- 따라서 일반 참조변수를 통해 인스턴스의 맴버에 접근할 수 있는 것과 같이 this로 인스턴스 변수에 접근할 수 있다.
- only 인스턴스 변수만 사용가능( static매세드는 인스턴스를 생성하지 않고도 호출가능& 호출되도 인스턴스가 존재하지 않을 수도 있음)
- 모든 인스턴스메서드에 지역변수로 숨겨진 채 존재
(5) 생성자를 이용한 인스턴스의 복사
class Car { String color; String gearType; int door; Car() { this("White","auto",4); } Car(Car(클래스) c) { color = c.color; gearType = c.gearType; door = c.door; // this(c.color, c.gearType, c.door) 와 동일 } Car(String color, String gearType, int door) { this.color = color; this.gearType = gearType; this.door = door; } } class CarTest public static void main() { Car c1 = new Car(); Car c2 = new Car(c1); // c1의 복사본 c2를 생성한다. } |
6. 변수의 초기화
(1) 변수의 초기화
변수의 초기화 : 변수를 선언하고 처음으로 값을 저장하는 것.
맴버변수(클래스변수&인스턴스변수)와 배열의 초기화는 선택적이지만, 지역변수는 반드시 사용하기 전에 반드시 초기화를 해주어야 한다.
*맴버변수의 초기화 방법
1. 명시적 초기화
2. 생성자
3. 초기화 블럭 : 인스턴스 초기화 블럭 & 클래스 초기화 블럭
(2) 명시적 초기화
명시적 초기화 : 변수를 선언과 동시에 초기화 하는 것
int door = 4; // 기본형 변수의 초기화
Engine e = new Engine(); // 참조형 변수의 초기화
(3) 초기화 블럭
초기화 블럭 내에는 메서드와 같이 조건문 반복문 예외처리구문 등 다양하게 사용 가능
* 클래스 초기화 블럭 : 클래스변수의 복잡한 초기화에 사용된다.
- static { . . .}
- 클래스 초기화 블럭은 클래스가 메모리에 처음 로딩될 때 한번만 수행
* 인스턴스 초기화 블럭 : 인스턴스변수의 복잡한 초기화에 사용된다.
- { . . . }
- 인스턴스 초기화 블럭은 생성자와 같이 인스턴스를 생성할 떄 마다 수행
- 생성자 보다 먼저 수행
- 인스턴스변수의 초기화는 보통 생성자를 이용, 따라서 인스턴스 초기화 블럭이 잘 사용되지 않는다.
- 클래스의 모든 생성자에서 공통적으로 수행되어야 하는 코드가 있는 경우, 생성자 대신 인스턴스 초기화 블록을 사용하면 코드의 중복을 줄 일 수 있다.
(4) 맴버변수의 초기화 시기와 순서
클래스변수의 초기화 시점 : 클래스가 처음 로딩될 때 딱 한번만 초기화 수행
클래스 변수의 초기화 순서 : 기본값 - 명시적 초기화 - 클래스 초기화 블록
인스턴스변수의 초기화 시점 : 인스턴스가 생성될 때마다 각 인스턴스 별로 초기화가 이루어진다.
인스턴스변수의 초기화순서 : 기본값 - 명시적 초기화 - 인스턴스 초기화 블록 - 생성자
'Studynote > Computer Science 12' 카테고리의 다른 글
[정리]Java chapter11 컬렉션 프레임웍과 유용한 클래스 (0) | 2018.11.05 |
---|---|
[정리] Java Chapter 7 객체지향프로그래밍2 (0) | 2018.11.05 |
10.14 제 10장 내부클래스 실습 (0) | 2018.11.05 |
10.14 제 10장 내부클래스 (0) | 2018.11.05 |
10.07.제 9장 java패키지 실습 (0) | 2018.11.05 |
댓글