[JAVA] 객체지향 프로그래밍-OOP(특징, 변수와 메소드)
객체 지향 프로그래밍(OOP) - Object-Oriented Programming
- 절차적 프로그래밍을 보완한 새로운 패러다임(반대 개념은 아님)
- 객체(Object)가 모여 상호협력하여 데이터를 처리하는 방식
- 프로그램을 묶음 단위로 나눠 사용하기 편하게 만들어놓은 프로그래밍 방식
객체지향언어의 특징
- 캡슐화
- 상속
- 다형성
- 추상화
클래스 구성
- 클래스 : 객체 데이터를 생성하는 설계도
- 객체 : 클래스와 new 연산자를 통해 만든 실제 데이터가 들어있는 변수
- 인스턴스 : 특정 클래스로부터 생성된 객체
- 메소드 : 해당 내용 참고
객체와 인스턴스
- 클래스로부터 객체를 만드는 과정을 클래스의 인스턴스화라고 한다.
- 어떤 클래스로부터 만들어진 객체를 그 클래스의 인스턴스라고 한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// 클래스
class Tv {
boolean power;
int channel;
void power() {
power = !power;
}
void channelUp() {
++channel;
}
void channelDown() {
--channel;
}
}
public class TvTest {
public static void main(String[] args) {
// 변수 Television -> 객체
// 변수 Television -> Tv 클래스의 인스턴스
Tv Television = new Tv();
// 클래스를 통해 객체 데이터를 new 생성
Television.channel = 7;
Television.channelUp();
System.out.println("현재 채널 " + Television.channel);
}
}
> 8
객체 배열
많은 수의 객체를 다뤄야 할 때, 객체 배열로 다룰 수 있다.
TV tv1, tv2, tv3 --> Tv[] TvArr = new Tv[3]
변수와 메소드
선언위치에 따른 변수의 종류
- 변수는 클래스변수, 인스턴스변수, 지역변수 세 종류가 존재한다.
- 변수의 종류를 결정짓는 중요한 요소는 ‘변수의 선언된 위치‘다.
변수 | 선언 위치 | 생성시기 | 소멸시기 |
---|---|---|---|
클래스변수 | 클래스 영역 | 클래스가 메모리에 올라갈 때 | 프로그램이 종료될 때 |
인스턴스변수 | 클래스 영역 | 인스턴스가 생성되었을 때 | 인스턴스가 소멸될 때 |
지역변수 | 클래스 영역 이외의 영역 (메소드, 생성자, 초기화 블록 내부) | 블록 내에서 변수 선언문이 수행되었을 때 | 블록을 벗어날 때 |
클래스 메소드와 인스턴스 메소드
- 인스턴스 메소드
- 메소드의 작업을 수행하는데 인스턴스 변수를 필요로 하는 메소드
- 클래스 메소드
- 인스턴스와 관계가 없는(인스턴스 변수나 인스턴스 메소드를 사용하지 않는) 메소드
두 메소드의 특징
- 클래스를 설계할 때, 멤버변수 중 모든 인스턴스에 공통으로 사용하는 것은
static
을 붙인다.
각 인스턴스는 서로 독립적이기 때문에 각 IV는 서로 다른 값을 유지한다. 하지만 모든 인스턴스에서 같은 값이 유지되어야 하는 변수는 static을 붙여 클래스변수로 정의해야 한다.
- 클래스 변수(static)는 인스턴스를 생성하지 않아도 사용이 가능하다.
static이 붙은 변수는 클래스가 메모리에 올라갈 때 자동적으로 인스턴스를 생성한다.
클래스 메소드는 인스턴스 변수를 사용할 수 없다.
메소드 내에서 인스턴스 변수를 사용하지 않으면, static을 붙이는 것을 고려한다.
클래스의 멤버변수 중 모든 인스턴스에 공통된 값을 유지해야 하는 것이 있다면, static을 붙인다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class field {
static int classVariable = 1; // 클래스변수
int instanceVariable = 10; // 인스턴스변수
int method() {
int localVariable = 100; // 지역변수
return localVariable;
}
}
public class Main {
public static void main(String[] args) {
System.out.println(field.classVariable); // 클래스변수 참조
field myField = new field(); // 인스턴스 생성
System.out.println(myField.instanceVariable); // 인스턴스변수 참조
System.out.println(myField.method()); // 메소드영역 내 지역변수 참조
}
}
- 인스턴스 변수는 독립적인 저장공간을 갖는다.
- 클래스 변수는 모든 인스턴스 변수가 공통된 저장공간을 공유하게 된다.
메소드
- 특정 작업을 수행하는 일련의 문장들을 하나로 묶은 것
- 어떠한 값을 입력하면 이 값으로 작업을 수행하여 결과를 반환한다.
메소드를 사용하는 이유
- 높은 재사용성
- 한번 만들어 놓은 메소드는 횟수 상관없이 호출할 수 있으며, 다른 프로그램에서도 사용이 가능하다.
- 중복된 코드 제거
- 같은 내용의 문장들이 여러 곳에서 반복하여 사용하곤 한다. 이럴 경우 문장들을 묶어 하나의 메소드로 작성하면, 반복되는 문장들을 메소드를 호출하는 한 문장으로 사용할 수 있다.
- 이럴 경우 수정사항이 생길 경우 수정해야 할 코드의 양도 줄어든다.
메소드의 선언과 구현
메소드는 아래와 같이 사용할 수 있다.
1
2
3
4
int add(int x, int y) {
int result = x + y;
return result;
}
- 메소드 이름(add) 앞에 반환할 타입, 반환될 value의 타입을 적고 반환값이 없는 경우에는 void를 적으면 된다.
‘void’는 ‘존재하지 않음, 아무것도 없음’을 의미
- 괄호 안에는 매개변수를 작성하면 되며, 각 매개변수 앞에 타입을 작성해야 한다.
- return문에는 앞에 작성한 반환할 타입에 맞게 반환을 하면 된다.
메소드의 호출
위와 같이 코드를 작성하였다면, 메소드를 호출해서 구현부의 문장을 수행되게 하면 된다.
1
2
3
int result = int add(5, 7);
System.out.print(result);
> 12
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.