1. 객체지향언어
1.1 객체지향언어
- 기존의 프로그래밍 언어에 몇 가지 새로운 규칙을 추가한 보다 발전된 형태
- 주요 특징
- 코드의 재사용성이 높다.
- 코드의 관리가 용이하다.
- 신뢰성이 높은 프로그래밍을 가능하게 한다.
2. 클래스와 객체
2.1 클래스와 객체의 정의와 용도
- 클래스의 정의 : 객체를 정의해 놓은 것을 의미
- 클래스의 용도 : 객체를 생성하는데 사용
- 객체의 정의 : 실제로 존재하는 것. 사물 또는 개념
- 객체의 용도 : 객체가 가지고 있는 기능과 속성에 따라 다름
- 유형의 객체 : 책상, 의자, 자동차 등과 같은 사물
- 무형의 객체 : 수학공식, 프로그램 에러와 같은 논리나 개념
2.2 객체와 인스턴스
- 인스턴스화 : 클래스로부터 객체를 만드는 과정
- 인스턴스 : 클래스로부터 만들어진 객체
- 인스턴스와 객체는 같은 의미이다.
2.3 객체의 구성요소 - 속성과 기능
- 속성 : 멤버변수, 특성, 필드, 상태
- 기능 : 메서드, 함수, 행위
2.4 인스턴스의 생성과 사용
클래스명 변수명;
: 클래스의 객체를 참조하기 위한 참조변수를 선언변수명 = new 클래스명();
: 클래스의 객체를 생성한 후, 객체의 주소를 참조변수에 저장
Tv t; //Tv클래스 타입의 참조변수 t 선언
t = new Tv(); // Tv인스턴스를 생성한 후, 생성된 Tv인스턴스의 주소를 t에 저장
인스턴스는 참조변수를 통해서만 다룰 수 있으며, 참조변수의 타입은 인스턴스의 타입과 일치해야한다.
2.5 객체 배열
- 객체 배열안에 객체의 주소가 저장된다.(참조변수 배열)
Tv[] tvArr = new Tv[3]; // 참조변수 배열(객체 배열)을 생성
tvArr[0] = new Tv();
tvArr[1] = new Tv();
tvArr[2] = new Tv(); // 객체를 생성해서 배열의 각 요소에 저장
Tv[] tvArr = { new Tv(), new Tv(), new Tv(), }; // 위의 예제와 동일
Tv[] tvArr = new Tv[100];
for(int i = 0; i < tvArr.length; i++) {
tvArr[i] = new Tv();
} // 양이 많은 배열을 초기화 할 때
2.6 클래스의 또 다른 정의
- 변수 : 하나의 데이터를 저장할 수 있는 공간
- 배열 : 같은 종류의 여러 데이터를 하나의 집합으로 저장할 수 있는 공간
- 구조체 : 서로 관련된 여러 데이터를 종류에 관계 없이 하나의 집합으로 저장할 수 있는 공간
- 클래스 : 데이터와 함수의 결합(구조체 + 함수)
3. 변수와 메서드
3.1 선언위치에 따른 변수의 종류
class Variables {
int iv; // 인스턴스 변수
static int cv; // 클래스 변수(static변수, 공유변수)
void method()
{
int lv = 0; // 지역변수
}
}
변수의 종류 | 선언위치 | 생성시기 |
---|---|---|
클래스변수(class variable) | 클래스 영역 | 클래스가 메모리에 올라갈 때 |
인스턴스변수(instance variable) | 클래스 영역 | 인스턴스가 생성되었을 때 |
지역변수(local variable) | 클래스 영역 이외의 영역(메서드, 생성자, 초기화 블럭 내부) | 변수 선언문이 수행되었을 때 |
3.2 클래스변수와 인스턴스변수
class Card {
String kind; // 무늬
int number; // 숫자 //인스턴스변수
static int width = 100; // 폭
static int height = 250; // 높이
// 클래스 변수
}
- 인스턴스변수는 인스턴스마다 각기 다른 값을 유지할 수 있지만, 클래스 변수는 항상 공통된 값을 가진다.
3.3 메서드
- 특정 작업을 수행하는 일련의 문장들을 하나로 묶은 것.
- <메서드를 사용하는 이유>
- 높은 재사용성(reusability)
- 중복된 코드의 제거
- 프로그램의 구조화
3.4 메서드의 선언과 구현
int add(int a, int b) { // 선언부(반환타입 : int, 메서드 이름 : add, 매개변수 선언 : int a, int b
int result = a+ b;
return result; // result를 반환
} // 구현부
3.5 메서드의 호출
메서드이름(값1, 값2, ...); // 메서드 호출 방법
3.6 return문
- return문은 현재 실행중인 메서드를 종료하고 호출한 메서드로 되돌아간다.
3.7 JVM의 메모리 구조
- 메서드 영역(method area) : 프로그램 실행 중에 어떤 클래스가 사용되면, JVM은 해당 클래스의 클래스파일(*.class)를 읽어서 분석하여 클래스에 대한 데이터를 이곳에 저장한다. 이 때, 그 클래스의 클래스 변수도 이 영역에 생성된다.
- 힙(heap) : 인스턴스가 생성되는 공간. 즉, 인스턴스 변수들이 생성되는 공간이다.
- 호출스택(call stack or execution stack) : 메서드의 작업에 필요한 메모리 공간을 제공한다. 메서드가 작업을 수행하는 동안 지역변수(매개변수 포함)들과 연산의 중간결과 등을 저장하는데 사용되고, 작업을 마치면 메모리공간은 비워진다.
<호출스택의 특징>
- 메서드가 호출되면 수행에 필요한 만큼의 메모리를 스택에 할당받는다.
- 메서드가 수행을 마치고나면 사용했던 메모리를 반환하고 스택에서 제거된다.
- 호출스택의 제일 위에 있는 메서드가 현재 실행 중인 메서드이다.
- 아래에 있는 메서드가 바로 위의 메서드를 호출한 메서드이다.
3.8 기본형 매개변수와 참조형 매개변수
- 기본형 매개변수 : 변수의 값을 읽기만 할 수 있다.(값이 복사가 된다.)
- 참조형 매개변수 : 변수의 값을 읽고 변경할 수 있다.(주소를 알 수 있다.)
3.9 참조형 반환타입
- 메서드가 ''객체의 주소를'' 반환한다는 것을 의미
3.10 재귀호출(recursive call)
void method() {
method(); // 재귀호출. 메서드 자기 자신을 호출한다.
}
- 재귀호출문을 반복문으로도 만들 수가 있는데, 재귀호출의 수행시간이 반복문보다 더 오래 걸린다. but 재귀호출문이 훨씬 간결하게 표현된다.(ex 팩토리얼)
3.11 클래스 메서드(static메서드)와 인스턴스 메서드
- 클래스 메서드 : 인스턴스와 관계없는 메서드
- 인스턴스 메서드 : 인스턴스와 관련된 작업을 하는(인스턴스 변수를 필요로 하는) 메서드
- 클래스를 설계할 때, 멤버변수 중 모든 인스턴스에 공통으로 사용하는 것에 static을 붙인다.
- 클래스 변수는 인스턴스를 생성하지 않아도 사용할 수 있다.
- 클래스 메서드는 인스턴스 변수를 사용할 수 없다.
- 메서드 내에서 인스턴스 변수를 사용하지 않는다면, static을 붙이는 것을 고려한다.
3.12 클래스 멤버와 인스턴스 멤버간의 참조와 호출
- 같은 클래스에 속한 멤버들 간에는 별도의 인스턴스를 생성하지 않고도 서로 참조 또는 호출이 가능하다. 단, 클래스멤버가 인스턴스 멤버를 참조 또는 호출하고자 하는 경웨는 인스턴스를 생성해야 한다.
4. 오버로딩(overloading)
4.1 오버로딩이란?
- 한 클래스 내에 이미 사용하려는 이름과 같은 이름을 가진 메서드가 있더라도 매게변수의 개수 또는 타입이 다르면, 같은 이름을 사용해서 메서드를 정의할 수 있다.
4.2 오버로딩의 조건
- 메서드 이름이 같아야 한다.
- 매개변수의 개수 또는 타입이 달라야 한다.(반환 타입은 영향을 주지 않는다.)
4.3 오버로딩의 장점
- 같은 기능을 하는 메서드를 하나의 이름으로 정의 할 수 있다.
4.4 가변인자(varargs)와 오버로딩
- 가변인자는 내부적으로 배열을 이용한다.
String concatenate(String s1, String... str) {...} // 가변인자는 항상 마지막에 위치해야 한다.
// 가변인자는 인자가 아예 없을 수도 있다.
5. 생성자(Constructor)
5.1 생성자란?
- 인스턴스가 생성될 때 호출되는 '인스턴스 초기화 메서드'이다.
Card c = new Card(); // Card()는 생성자이다.
- <생성자의 특징>
- 생성자의 이름은 클래스의 이름과 같아야 한다.
- 생성자는 리턴 값이 없다.
- 오버로딩이 가능하다.
class Card {
Card() { // 매개변수가 없는 생성자
...
}
Card(String K, int num) { // 매개변수가 있는 생성자
...
}
}
5.2 기본 생성자(default constructor)
- 클래스에 생성자를 정의하지 않아도 인스턴스를 생성할 수 있었던 이유는 기본 생성자 덕분이다.(클래스에 정의된 생성자가 하나도 없을 때, 자동 생성)
클래스이름() { }
5.3 매개변수가 있는 생성자
- 인스턴스를 생성하는 것과 동시에 원하는 값으로 초기화가 가능하다.
class Car {
String color; // 색상
String gearType; // 변속기 종류
int door; // 문의 개수
Car() {} // 생성자
Car(String c, String g, int d) { // 매개변수가 있는 생성자
color = c;
gearType = g;
door = d;
}
}
Car c = new Car("white", "auto", 4);
5.4 생성자에서 다른 생성자 호출하기 - this()
, this
this
: 인스턴스 자신을 가리키는 참조변수, 인스턴스의 주소가 저장되어 있다. 모든 인스턴스메서드에 지역변수로 숨겨진 채로 존재한다.this()
,this(매개변수)
: 생성자 또는 같은 클래스의 다른 생성자를 호출할 때 사용한다.- 생성자의 이름으로 클래스이름 대신
this
를 사용한다 - 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출이 가능하다.
- 생성자 내에서 다른 생성자를 호출할 때,
this
를 사용한다. - static메서드에서는 사용이 불가하다.
5.5 생성자를 이용한 인스턴스의 복사
Car(Car c) {
color = c.color;
gearType = c.gearType;
door = c.door;
}
6. 변수의 초기화
6.1 변수의 초기화
- 멤버변수는 초기화를 하지 않아도 자동적으로 기본값으로 초기화가 이루어 지지만, 지역변수는 사용하기 전에 반드시 초기화해야하 한다.
- <멤버변수의 초기화 방법>
- 명시적 초기화(explicit initialization)
- 생성자(constructor)
- 초기화 블럭(initialization block)
6.2 명시적 초기화(explicit initialization)
- 변수를 선언과 동시에 초기화하는 것
6.3 초기화 블럭(initialization block)
- 클래스 초기화 블럭 : 클래스변수의 복잡한 초기화에 사용한다. 클래스가 메모리에 처음 로딩될 때 한번만 수행
- 인스턴스 초기화 블럭 : 인스턴스변수의 복잡한 초기화에 사용한다. 인스턴스를 생성할 때 마다 수행
class InitBlock {
static { /*클래스 초기화블럭 */ }
{ /*인스턴스 초기화블럭*/}
//...
}
→ 코드의 중복을 제거하고 신뢰성을 높인다.
6.4 멤버변수의 초기화 시기와 순서
- 클래스변수의 초기화 시점 : 클래스가 처음 로딩될 때 한번 초기화
- 인스턴스변수의 초기화 시점 : 인스턴스가 생성될 때마다 각 인스턴스별로 초기화
- 클래스변수의 초기화순서 : 기본값 → 명시적초기화 → 클래스 초기화 블럭
- 인스턴스변수의 초기화순서 : 기본값 → 명시적초기화 → 인스턴스 초기화 블럭 → 생성자
'LANGUAGE > [JAVA]' 카테고리의 다른 글
Chapter08 예외 처리(exception handling) (0) | 2021.08.25 |
---|---|
Chapter07 객체지향 프로그래밍II(Object-oriented Programming II) (0) | 2021.08.24 |
Chapter05 배열(array) (0) | 2021.08.18 |
Chapter04 조건문과 반복문 if, switch, for, while statement (0) | 2021.08.17 |
Chapter03 연산자(operator) (0) | 2021.08.13 |