티스토리 뷰

▶클래스(Class) 기본개념

이번 글에서는 자바 class의 기본개념에 대해 알아보려고 합니다.

class에 대해 공부하면 할 수록 정말 알아야 할 게 많다고 생각이 드는데요...😂

이번 글과 이어진 글들을 통해 차근차근 정리해 봅시다💪🏻

 

클래스에 대해 본격적으로 알아보기 전에 객체 지향과 객체에 대해 먼저 알아보도록 합시다.

 

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

객체 지향 프로그래밍에서는 모든 데이터를 객체(Object)로 취급하며, 이러한 객체가 바로 프로그래밍의 중심이 됩니다.

 

객체(Object)란 간단히 이야기하자면 실생활에서 우리가 인식할 수 있느 사물로 설명할 수 있다고 합니다.

이러한 객체의 상태(state)와 행동(behavior)를 구체화하는 형태의 프로그래밍이 바로 객체 지향 프로그래밍인데요.

 

이때 객체를 만들어 내기 위한 설계도 혹은 틀과 같은 개념을 클래스(class)라고 합니다.

 

🔎 클래스(class) ?


자바에서 클래스(class)란

객체를 정의하는 틀 또는 설계도와 같은 의미로 사용합니다.

자바에서는 이러한 틀인 클래스를 가지고, 여러 객체를 생성하여 사용하게 되는데요.

 

클래스는 필드(filed)로 구성되어 있습니다.

 

클래스는 다음과 같은 두 가지의 특징을 기억하고 있어야 합니다.

 

1️⃣ 타입이다.

클래스 안에 선언된 변수와 메소드를 사용하고 싶다면, 해당 클래스 타입으로 변수를 선언해야 합니다.

위의 말이 어렵다면 아래 코드를 통한다면 바로 이해할 수 있습니다.

String name = "doeunn";

앞글자가 대문자이면 "클래스"라는 것을 우리는 알고 있습니다.

따라서 우리는 위 코드를 보게 되면 "아 String이라는 클래스 타입으로 name이라는 변수에 doeunn이라는 값을 담았구나"

하고 말이죠! 

클래스를 통해 인스턴스를 만들고 싶다면 즉, 클래스를 사용하여 객체를 만들고 싶다면 아래와 같이 선언할 겁니다.

Animal monkey = new Animal();

 

 

따라서 클래스를 선언한다라고 하는 것은 하나의 타입을 새로 만드는 것이며

타입으로 선언한 변수를 통해 필드에 접근할 수 있겠구나 하고 생각할 수 있겠습니다.

 

2️⃣ 주어이다.

이제 타입이라는 개념을 통해 객체 즉, 인스턴스를 만들었다면 이제 클래스 안에 선언해 두었던 메소드를 사용해야겠죠?

Monkey.eat("banana");

메소드를 사용하기 위해서는 클래스부터 접근을 해야 하기 때문에

클래스는 주어이다. 라고 해석되기도 합니다.

 

📌 인스턴스(instance)

자바에서 클래스를 사용하기 위해서는 우선 해당 클래스 타입의 객체(Object)를 선언해야 합니다.

사용을 하려면 어떤 클래스를 사용할 건지를 명시해야겠죠?

 

이렇게 클래스로부터 객체를 선언하는 과정을 클래스의 인스턴스 화라고 합니다.

또한, 이렇게 선언한 해당 클래스 타입의 객체를 인스턴스(instance)라고 합니다.

 

→ 💡 메모리에 할당된 객체 : 인스턴스

 

자바에서는 하나의 클래스로부터 여러 개의 인스턴스를 생성할 수 있습니다.

예를 들어 붕어빵 틀이 하나 있으면 붕어빵 여러 개를 만들어낼 수 있죠?

이렇게 생성된 인스턴스는 독립된 메모리 공간에 저장된 자신만의 필드를 가질 수 있습니다.

 

📌 클래스 선언

우리는 이제 공통요소를 한 번에 클래스 안에 선언해 놓고 가져다 사용만 하도록 설계를 해야 합니다.

class 클래스명 {
  필드(변수, 메소드)
}

클래스 내부에 선언한 변수나 메소드들을 필드(filed)라고 부릅니다.

클래스를 인스턴스 화 하게 되면 해당 클래스의 필드를 사용할 수 있게 되겠죠.

 

📌 클래스의 필드 사용

우선 필드를 사용하기 위해 인스턴스를 하나 정의해 보겠습니다.

인스턴스를 만드는 방법은 다음과 같습니다.

클래스명 객체 = new 생성자();

이제 마침표(.)를 통해 해당 주소를 참조하도록 하는 것인데요.

class Animal {
  void eat(String something) {
    system.out.println(something + "yammmm!");
  }
}

Animal monkey = new Animal();
monkey.eat("banana");

 

 📌 생성자(Constructor)

자바에서 생성자는 클래스 이름과 같은 이름으로 뒤에 소괄호()가 있는 형태로,

메소드와 기능이 똑같지만 메소드라고 부르지 않습니다.

생성자는 리턴이라는 기능이 존재하지 않기 때문인데요!

 

생성자는 new 연산자를 통해서 인스턴스를 생성할 때 반드시 호출이 되고

해당 클래스의 필드를 메모리에 할당한 후 부여된 주소값을 가져오게 됩니다.

 

따라서 생성자는 다음과 같은 특징을 가집니다.

 

  1. 생성자는 반환값이 없지만, 반환 타입을 void형으로 선언하지 않는다.
  2. 생성자는 초기화를 위한 데이터를 인수로 전달받을 수 있다.
  3. 객체를 초기화 하는 방법이 여러 개 존재할 경우에는 하나의 클래스가 여러 개의 생성자를 가질 수 있다.

 

→ 생성자가 하는 일 : 클래스의 필드를 메모리에 올리고 그 주소값을 가져온다
→ 이때 앞에 new 키워드를 붙여서 Heap 메모리에 올리는 것을 알려준다
→ 따라서 선언한 인스턴스에는 할당된 필드의 주소값이 들어가게 되며
→ 이 인스턴스에 .(닷 연산자, 하위 연산자)를 통해 필드에 접근해서 언제든지 사용할 수 있게 된다

 

❓ 생성자의 선언

자바에서 클래스 생성자를 선언하는 문법은 다음과 같습니다.

// 기본 생성자
클래스이름() { ... }

// 매개변수가 있는 생성자
클래스이름(인수1, 인수2, ...) { ... }

참고로 클래스 내부에서 Ctrl + Space 는 기본 생성자 단축키,

Alt + Shift + S 하고 O 를 누르는 건 매개변수가 있는 생성자 단축키 입니다.

 

❓ 생성자의 호출

자바에서는 new 키워드를 사용하여 객체를 생성할 때 자동으로 생성자가 호출됩니다.

class Animal {
    Animal() {
        System.out.println("Constructor call !!!");
    }
}

public class main {
    public static void main(String[] args) {
        Animal monkey = new Animal();
    }
}

new 키워드를 통해 객체를 생성하기만 했을 뿐인데, 바로 생성자가 호출된 것을 확인할 수 있습니다.

출력 결과

 

 📌this

자바에서 this는 인스턴스 자기 자신을 가리키는 키워드입니다.

this를 통해 클래스 메소드 및 생성자에서 자기 자신의 데이터를 업데이트하거나 조작할 수 있습니다.

 

클래스의 필드에 접근한 객체가 가지고 있는 필드의 주소값을 this라는 변수에 자동으로 담기게 됩니다.

 

this 키워드를 사용하는 이유는

인스턴스 자기 자신의 필드에 있는 값을 의미하며

외부로부터 들어온 인자와 구분하기 위함입니다.

public class Test{

  //클래스 필드
  int a;

  //메소드
  void set_test(int a){
    // 클래스 필드 변수 a값에 set_test 매개변수 a값을 넣음.
    this.a = a;
  }
}

 

📌 간단한 클래스 예제

학생 클래스에는 학생번호, 국어점수, 영어점수, 수학점수가 있어야 합니다.

그리고 학생의 점수를 입력받은 뒤 총점과 평균을 출력하려고 합니다.

 

처음 무작정 클래스를 선언했을 때 실수한 점은

"공통요소"라는 점입니다.

 

우리는 어쨌든간에 Student 라는 클래스를 생성하여 인스턴스 화를 통해 객체를 여러 개 만들어 낼 것입니다.

그렇기 때문에 모든 학생들은 학생번호, 국어점수, 영어점수, 수학점수라는 변수를 가지게 될 것입니다.

더불어 총점과 평균도 모든 학생들이 가지게 될 것이라는 것까지 생각하지 못하였는데

이점도 유념하며 클래스를 정의해 보도록 하겠습니다.

package classTest;

class Student {
	String studentNum;
	int korScore;
	int engScore;
	int mathScore;
	int total;
	double average;
	
	// 생성자
	public Student(String studentNum, int korScore, int engScore, int mathScore) {
		this.studentNum = studentNum;
		this.korScore = korScore;
		this.engScore = engScore;
		this.mathScore = mathScore;
		this.total = korScore + engScore + mathScore;
		this.average = total / 3.0;
	}
	
}

public class ClassTask2 {
	public static void main(String[] args) {
		Student student = new Student("2022001", 90, 90, 100);
		System.out.println(student.total);
		System.out.println(student.average);
	}
}

 

728x90
LIST
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/03   »
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
글 보관함