포스트

[JAVA] 객체지향 프로그래밍-OOP(특징, 변수와 메소드)

객체 지향 프로그래밍(OOP) - Object-Oriented Programming

  • 절차적 프로그래밍을 보완한 새로운 패러다임(반대 개념은 아님)
  • 객체(Object)가 모여 상호협력하여 데이터를 처리하는 방식
  • 프로그램을 묶음 단위로 나눠 사용하기 편하게 만들어놓은 프로그래밍 방식

객체지향언어의 특징

  • 캡슐화
  • 상속
  • 다형성
  • 추상화

클래스 구성

  • 클래스 : 객체 데이터를 생성하는 설계도
  • 객체 : 클래스와 new 연산자를 통해 만든 실제 데이터가 들어있는 변수
  • 인스턴스 : 특정 클래스로부터 생성된 객체
  • 메소드 : 해당 내용 참고

OOP특징

객체와 인스턴스

  • 클래스로부터 객체를 만드는 과정을 클래스의 인스턴스화라고 한다.
  • 어떤 클래스로부터 만들어진 객체를 그 클래스의 인스턴스라고 한다.
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 라이센스를 따릅니다.