객체지향언어
객체지향언어의 주요 특징
1. 코드의 재사용성이 높다.
새로운 코드를 작성할 때 기존의 코드를 이요하여 쉽게 작성할 수 있다.
2. 코드의 관리가 용이하다.
코드간의 관계를 이용해서 적은 노력으로 쉽게 코드를 변경할 수 있다.
3. 신뢰성이 높은 프로그래밍을 가능하게 한다.
제어자와 메서드를 이용해서 데이터를 보호하고 올바른 값을 유지하도록 하며,
코드의 중복을 제거하여 코드의 불일치로 인한 오동작을 방지할 수 있다.
클래스와 객체
클래스와 객체의 정의와 용도
- 클래스의 정의 : 클래스란 객체를 정의해 놓은 것
- 클래스의 용도 : 클래스는 객체를 생성하는데 사용
- 객체의 정의 : 실제로 존재하는 것. 사물 또는 개념
- 객체의 용도 : 객체가 가지고 있는 기능과 속성에 따라 다름
객체와 인스턴스
- 클래스의 인스턴스화(instantiate) : 클래스로부터 객체를 만드는 과정
- 클래스의 인스턴스(instance) : 클래스로부터 만들어진 객체
클래스 ----인스턴스화----> 인스턴스(객체)
객체의 구성요소 - 속성과 기능
인스턴스의 생성과 사용
소스코드
- 인스턴스는 참조변수를 통해서만 다룰 수 있으며, 참조변수의 타입은 인스턴스의 타입과 일치해야 함
- 참조변수에는 하나의 값(주소)만이 저장될 수 있으므로 둘 이상의 참조변수가 하나의 인스턴스를 가리키는(참조하는) 것은 가능하지만 하나의 참조변수로 여러 개의 인스턴스를 가리키는 것은 가능하지 않음!
그림6-2
객체 배열
- 객체를 배열로 다루는 것을 '객체 배열'이라고 하는데, 객체 배열 안에 객체의 주소가 저장됨
ex) Tv[] tvArr = new Tv[3];
※ '다형성(polymorphism)'을 이용하면 하나의 배열로 여러 종류의 개게를 다룰 수 있음
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
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();
}
|
cs |
클래스의 또 다른 정의
1) 클래스 - 데이터와 함수의 결합
- 데이터 저장형태의 발전과정
변수 --> 배열 --> 구조체 --> 클래스
- 객체지향언어에서는 변수(데이터)와 함수를 하나의 클래스에 정의하여 서로 관계가 깊은 변수와 함수들을 함께 다룰 수 있게 함 (C언어에서는 문자열을 문자의 배열로 다루지만, 자바에서는 String이라는 클래스로 문자열을 다룸)
- 문자열을 클래스로 정의한 이유는 문자열과 문자열을 다루는데 필요한 함수들을 함께 묶기 위해서
--> 변수와 함수가 서로 유기적으로 연결되어 작업이 간단하고 명료해짐!
2) 클래스 - 사용자정의 타입(user-defined type)
- 사용자정의 타입 : 프로그래머가 서로 관련된 변수들을 묶어서 하나의 타입으로 새로 추가하는 것
변수와 메서드
선언위치에 따른 변수의 종류
- 변수의 종류 3가지 (변수의 선언된 위치 기준)
· 인스턴스 변수
· 클래스변수
· 지역 변수
변수의 종류 | 선언위치 | 생성시기 |
클래스 변수(class variable) | 클래스 영역 | 클래스가 메모리에 올라갈 때 |
인스턴스 변수(instance variable) | 인스턴스가 생성되었을 때 | |
지역변수(local variable) | 클래스 영역 이외의 영역 (메서드, 생성자, 초기화 블럭 내부) |
변수 선언문이 수행되었을 때 |
1) 인스턴스 변수(instance variable)
· 클래스 영역에 선언되며, 클래스의 인스턴스를 생성할 때 만들어짐
· 인스턴스는 독립적인 공간을 가지므로 서로 다른 값을 가질 수 있음
2) 클래스 변수(class variable)
· 인스턴스 변수 앞에 static을 붙임 ex) static int abc;
· 모든 인스턴스가 공통된 저장공간(변수)을 공유함
· 인스턴스 변수와는 달리 인스턴스를 생성하지 않고도 바로 사용할 수 있다는 특징이 있음!
· 클래스이름.클래스변수
· 메모리에 로딩될 때 생성되어 프로그램이 종료될 때까지 유지되며, public을 붙이면 전역변수의 성격을 가짐
3) 지역변수(local variable)
· 메서드 내에 선언되어 메서드 내에서만 사용 가능하며, 메서드가 종료되면 소멸되어 사용할 수 없게 됨
인스턴스변수는 인스턴가 생성될 때마다 생성되므로 인스턴스마다 각기 다른 값을 유지할 수 있지만, 클래스 변수는 모든 인스턴스가 하나의 저장공간을 공유하므로, 항상 공통된 값을 갖는다.
메서드
- 메서드(method) : 특정 작업을 수행하는 일련의 문장들을 하나로 묶은 것
- 메서드를 사용하는 이유
· 높은 재사용성(reusability)
· 중복된 코드의 제거
· 프로그램의 구조화
메서드의 선언과 구현
- 메서드의 선언부는 '메서드의 이름'과 '매개변수 선언', 그리고 '반환타입'으로 구성되어 있으며, 메서드가 작업을 수행하기 위해 어떤 값들을 필요로 하고 작업의 결과로 어떤 타입의 값을 반환하는지에 대한 정보를 제공함
메서드의 호출
메서드이름(값1, 값2, ...); // 메서드를 호출하는 방법
- 같은 클래스 내의 메서드끼리는 참조변수를 사용하지 않고도 서로 호출이 가능하지만 static 메서드는 같은 클래스 내의 인스턴스 메서드를 호출할 수 없음
return 문
- return문은 현재 실행중인 메서드를 종료하고 호출한 메서드로 되돌아감
- 반환값이 있는 경우 반드시 return문이 있어야 함
- void문의 경우 프로그래머가 return문을 작성하지 않아도 컴파일러가 메서드의 마지막에 'return;'을 자동적으로 추가함
- 매개변수의 유효성 검사
· 적절하지 않은 값이 매개변수를 통해 넘어온다면 매개변수의 값을 보정하던가, 보정하는 것이 불가능하다면 return문을 사용해서 작업을 중단하고 호출한 메서드로 되돌아가야 함
1
2
3
4
5
6
7
8
9
|
float divide(int x, int y) {
// 작업을 하기 전에 나누는 수(y)가 0인지 확인
if(y==0) {
System.out.println("0으로 나눌 수 없습니다.");
return 0; // 매개변수가 유효하지 않으므로 메서드를 종료
}
return x / (float)y;
}
|
cs |
클래스 메서드(static 메서드)와 인스턴스 메서드
- 메서드 앞에 static이 붙어 있으면 클래스 메서드이고, 붙어있지 않으면 인스턴스 메서드
- 클래스 메서드도 객체를 생성하지 않고도 '클래스이름.메서드이름(매개변수)'와 같이 호출 가능
- 인스턴스 메서드는 반드시 객체를 생성해야 호출 가능
- 인스턴스 메서드는 인스턴스 변수와 관련된 작업을 하는, 즉 메서드의 작업을 수행하는데 인스턴스 변수를 필요로 하는 메서드
- 인스턴스와 관계없는(인스턴스 변수나 인스턴스 메서드를 사용하지 않는) 메서드를 클래스 메서드(static 메서드)로 정의
1. 클래스를 설계할 때, 멤버변수 중 모든 인스턴스에 공통으로 사용하는 것에 static을 붙임
2. 클래스 변수(static변수)는 인스턴스를 생성하지 않아도 사용할 수 있음
- 클래스변수는 클래스가 메모리에 올라갈 때 이미 자동적으로 생성되기 때문
3. 클래스 메서드(static메서드)는 인스턴스 변수를 사용할 수 없음
- 인스턴스변수는 인스턴스가 반드시 존재해야만 사용할 수 있는데, 클래스메서드는 인스턴스 생성 없이 호출가능하므로 클래스 메서드가 호출되었을 때 인스턴스가 존재하지 않을 수도 있어서 클래스 메서드에서 인스턴스 변수의 사용을 금지함
- 인스턴스 변수, 인스턴스메서드에서는 static이 붙은 멤버들을 사용할 수 있음
4. 메서드 내에서 인스턴스 변수를 사용하지 않는다면, static을 붙이는 것을 고려함
- 메서드 호출시간이 짧아지므로 성능이 향상됨
예제
출처 : <자바의 정석>, 남궁 성
'JAVA > JAVA' 카테고리의 다른 글
[자바의 정석] 3-4 오버로딩(overloading) (0) | 2020.03.11 |
---|---|
[자바의 정석] JVM의 메모리 구조 (0) | 2020.03.11 |
자바의 정석 [5-1] 배열 (0) | 2020.03.08 |
VS Code에 자바 설치하기 (0) | 2020.03.05 |
자바의 정석 [2-1] 변수 (0) | 2020.03.02 |