[JAVA] 객체, 클래스(class)

박창조·2024년 4월 4일

JAVA

목록 보기
2/2
post-thumbnail

객체지향프로그래밍(Object-Oriented Programming) 이란 ❓

  • 프로그램 설계방법론의 일종
  • 입력 받은 데이터를 순서대로 처리리하고 결과를 도출하는 절차지향에서 벗어나 여러 독립적인 부품들의 조합, 즉 객체들의 유기적인 협력과 결합으로 파악하고자 하는 컴퓨터 프로그래밍의 패러다임을 의미합니다.

JAVA는 객체지향적인 프로그래밍의 대표적인 언어이다. 객체지향 프로그래밍의 가장 중요한 부분 중 한가지는 “객체”를 어떻게 사용하느냐이다. Class는 객체를 사용하는데 이용되는 중요한 개념이다.

객체(object)란 ❓

  • 실제로 존재하는 것.
  • 주변에 볼 수 있는 책상, 의자, 자동차와 같은 사물
  • 개념이나 논리와 같은 논리와 같은 무형적인 것들
  • 객체의 용도는 객체가 가지고 있는 상태(state)와 행위(behavior) 따라 다름

클래스(Class)란❓

“객체를 정의해 놓은 것”

“객체의 설계도

“객체에 속하는 상태를 표현하는 멤버변수(variable) 과 기능을 표현하는 메소드(method)를 정의한 것이다.

클래스와 객체의 관계를 설명할 때, “붕어빵 틀”붕어빵을 이용하여 많이 설명한다.

붕어빵 틀은 클래스이고, 붕어빵 틀을 이용해 만들어낸 붕어빵을 객체라고 한다. 이때, 붕어빵안에 담는 재료(데이터)에 따라 팥 붕어빵, 슈크림 붕어빵 등 다양한 붕어빵을 만들어 낼 수 있다.

이렇게 정의된 클래스를 통해 객체를 생성하는 과정을, “클래스의 인스턴스화” 라고 하고, 클래스를 통해 생성된 객체를 인스턴스라고 한다.


클래스의 구성요소

1️⃣ 속성(상태)를 표현하는 멤버 변수(variable)

  • 객체의 상태(state) 값을 저장하는 공간, 필드(field)라고도 불린다.
  • 클래스 내에서 변수가 선언되는 위치에 따라 다음과 같이 3가지로 구문된다.

✅ 인스턴스 변수

  • 클래스 영역에 선언
  • 클래스의 인스턴스를 생성할 때 만들어짐.
  • 생성된 인스턴스 안에서만 사용되는 변수

✅ 클래스 변수

  • static 키워드가 함께 사용된 변수
  • 클래스가 메모리에 올라갔을 때 만들어짐
  • 모든 인스턴스가 공유하여 사용하는 변수
  • 인스턴스를 생성하지 않고도 언제라도 바로 사용할 수 있다.
  • 전역변수의 성격을 가짐

✅ 지역 변수

  • 인스턴스, 클래스 변수를 제외한 나머지 변수
  • 메소드, 생성자 내부 블록에서 사용됨
  • 메소드안에서 변수 선언문이 실행되었을 때 생성
  • 메소드가 종료되면 소멸되어 사용하지 못한다.

2️⃣ 가능을 나타내는 메소드(method)

  • 객체가 가지고 있는 동작들을 나타내는 함수

3️⃣ 생성되는 객체를 초기화해주는 생성자(constructor)

  • 객체가 생성될 때 자동으로 호출되며, 인스턴스 변수를 원하는 값으로 초기화할 수 있는 메소드

클래스(Class)를 정의 하는 방법

  • JAVA에서 클래스를 정의하는 방법 다음과 같이 **class 라는 키워드**를 통해 정의
  • class 키워드 앞에 접근제어자를 함께 사용
  • 클래스의 이름은 “대문자”로 시작하도록 한다.

예를 들어 가정에 흔히 찾아볼 수 있는 TV를 객체로 만든다고 해보자. 이때 TV 객체에는 다음과 같은 정보가 들어있어야 할 것이다.

  • 멤버변수(상태): 해상도, 볼륨, 현재 채널 정보 등
  • 메소드(기능) : 전원 on/off, 볼륨 조절기능, 채널 번경하기.

위 내용을 바탕으로 클래스를 정의해보면 다음과 같이 표현할 수 있다.

// TV 클래스 정의
public class TV{
	String resolution; //해상도 (FHD,QHD,UHD 등) , 
	boolean power; //전원 상태 , (인스턴스 변수)
	static int channel; //채널 정보 , (클래스 변수)
	
	void power() {}; //전원 on / off
	void channelUp() {}; // 채널 올리기
	void channelDown() {}; // 채널 내리기
	int channelSearch() {} // 채널 검색
}

클래스(class)을 통한 객체(인스턴스) 생성

new 키워드를 사용하여 인스턴스를 생성할 수 있다.

이를 통해 각각 서로에게 영향을 주지 않는 서로 다른 객체들을 생성할 수 있다.

TV lgTv; //TV 클래스의 객체에 대한 주소를 가지는 lgTv라는 이름을 가진 참조변수 선언

lgTv = new TV(); //lgTv라는 이름을 가진 인스턴스 생성 후 lgTv 참조변수에 할당

TV lgTv = new TV(); //변수 선언과 인스턴스 생성을 동시에 

위와 같이 new키워드를 통해 인스턴스를 생성하게 될때 컴퓨터 내부적으로는 어떤 일이 일어날까?

위 그림은 TV 클래스를 이용하여 lgTv변수 라는 인스턴스를 생성했을 때, 메모리에 생기는 일을 간단게 표현한 것이다.

그림에서 보다시피 인스턴스가 생성되면, 따로 클래스의 멤버변수와 메소드가 정의된 부분이 모인 인스턴스의 메모리가 생성이 되고, 해당 위치의 주소값을 선언하면서 명명한 변수의 값으로 저장하게 된다.

이때 잘 기억해야 할 것은 lgTv변수 에 저장된 값은 메모리 상에 만들어진 인스턴스의 메모리 주소라는 것이다. 즉 변수에 직접 객체의 값들이 할당되는 것이 아니라, 주소만 참조하는 것뿐이다.

따라서 인스턴스는 참조변수를 통해서만 다룰 수 있다.


객체에 접근하기

객체의 멤버변수나, 메소드에 접근할 때는 (.)연산자 를 사용한다.

//생성한 인스턴스안에서 변수에 접근하는 예시
lgTv.resolution = "QHD";
System.out.println(lgTv.resolution); //"QHD" 출력

접근 제어자

"클래스 혹은 클래스 내에서 변수와 메소드의 사용 범위를 설정해주는 키워드"

접근제어자에는 4가지 종류가 있다.

1️⃣ private

  • 클래스를 정의 할 때, 변수와 메소드를 선언할 때 사용
  • private이 붙은 변수나 메서드는 해당 클래스 안에서만 접근이 가능

2️⃣ default

  • 클래스를 정의 할 때, 변수와 메소드를 선언할 때 사용
  • 접근 제어자를 별도로 설정하지 않는다면 default 접근 제어자가 자동으로 설정
  • 동일한 패키지(package)안세서 접근 가능

3️⃣ protected

  • 변수와 메소드를 선언할 때 사용
  • protected가 붙은 변수나 메서드는 동일 패키지의 클래스 또는 해당 클래스를 상속받은 클래스에서만 접근이 가능

4️⃣ public

  • 변수와 메소드를 선언할 때 사용
  • public 접근 제어자가 붙은 변수나 메서드는 어떤 클래스에서도 접근이 가능

제어 제어자를 사용하는 이유?

“접근 제어자를 이용하면 프로그래머의 실수를 방지할 수 있고 기타 위험 요소를 제거할 수 있는 등의 장점이 있다.”

private < default < protected < public 순으로 접근을 많이 허용한다.


static 키워드

  • 클래스에서 공유되는 변수메서드를 정의할 때 사용
  • static 키워드가 붙은 변수나 메소드는 인스턴스를 따로 생성하지 않고, 바로 호출이 가능하다.
class Counter  {
    static int count = 0;

    public static int getCount() {
        return count;
    }
}

public class Main(){
	public static void main(String[] args){
		System.out.println(Counter.getCount()); // 인스턴스 생성 없이 바로 호출
	}
}

static키워드로 선언된 변수들은 모든 인스턴스에서 동일할 내용을 공유한다는 점이 특징이다. 즉 서로다른 인스턴스에서 static키워드로 선언된 변수와 메소드는 동일한 메모리 주소 값을 참조하여 사용하게 되는 것이다.

static 변수 (클래스 변수)

  • 클래스가 메모리에 올라갔을 때 만들어진다.
  • 모든 인스턴스가 공유하여 사용하는 변수
  • 인스턴스를 생성하지 않고도 언제라도 바로 사용할 수 있다.
  • 전역변수의 성격을 가짐
class Counter  {
    static int count = 0;
    Counter() {
        count++;
    }
}

public class Sample {
    public static void main(String[] args) {
        Counter c1 = new Counter();
        Counter c2 = new Counter();
        
        System.out.println(Counter.count);
    }
}

// 출력 결과
// 2

static 메소드 (클래스 메소드)

  • 인스턴스를 생성하지 않고도 즉시 호출이 가능하다.
  • static 메소드는 인스턴스가 생성되지 않아도 사용 가능해야 하기 때문에, 인스턴스 변수를 사용할 수 없다.
  • 메모리 낭비를 줄일 수 있다.
  • 값을 공유할 수 있기 때문에
  • 재사용이 가능하다.

참고
05-03 메서드 더 살펴보기

[Java] 자바 - 접근제어자 public, private, protected 및 default

[JAVA] 클래스란? (클래스, 객체, new, 메소드, 생성자, this...)

PoiemaWeb

책 - <Java의 정석>

profile
https://www.scent-jo.dev/blog/ 로 이전합니다!

0개의 댓글