본문 바로가기
개발언어/Java : 자바

자바 쉽게 배우기 6 - 클래스와 객체

by 개발자D 2023. 1. 6.

클래스와 객체

이번글에서는 클래스와 객체에 대해 알아봅시다. 그전에 왜 자바에서는 클래스와 객체를 사용하는 지부터 살펴봅시다. 자바는 객체지향 프로그래밍 언어입니다. 객체가 무엇일까요? 넓은 의미에서 객체는 이 세상에 존재하는 모든 것들을 의미합니다. 형상이 있는 것과 없는 것 모두 객체가 될 수 있습니다. 

 

컴퓨터에게 실제 세계를 이해시키기 위해서는 현실의 사물을 컴퓨터가 이해할 수 있는 방식으로 해석해 주는 과정이 필요합니다. 우리는 그 과정에서 객체를 사용하게 되죠. 

 

철수라는 객체를 만들어 봅시다. 철수 객체에는 나이, 성별, 직업, 하는 행동 (블로그 포스팅, 개발, 유튜브 시청) 등의 정보가 포함되어 있습니다. 물론 현실의 철수가 가지는 정보만큼 방대한 양을 담는 것은 무리겠지만 철수를 표현하는 것에는 무리가 없어 보입니다. 이런 식으로 영희, 강아지, 집 등을 만들어 그들 간의 관계를 설정해 줄 수도 있습니다.

 

이렇듯 객체 지향 프로그래밍은 현실의 객체를 컴퓨터가 이해할 수 있는 형태로 만들어 이것들을 조립하여 사용하는 방식으로 이루어집니다. 객체 지향 프로그래밍을 사용하면 상속을 통해 코드를 재사용하거나 확장하기에 용이하고, 모델링을 쉽고 효율적으로 할 수 있다는 장점이 있습니다. 이제 각설하고 클래스와 객체에 대해 알아봅시다.

 

클래스(Class)와 객체(Object) 

클래스

클래스는 객체를 정의해 놓은 매뉴얼(설계도)입니다. 클래스를 통해 인스턴스를 생성할 수 있습니다. 같은 클래스를 통해 생성된 인스턴스는 같은 정의에 의해 생성되었기 때문에 비슷한 성격을 갖습니다. 완전히 같은 인스턴스를 만들 수도 있지만, 조금 다른 인스턴스를 만드는 것도 가능합니다. [사람] 클래스를 사용해 [철수]와 [영희] 인스턴스를 만들 때, 각각 다른 정보를 넘겨주면 사람이라는 공통된 성격을 가지고 있지만 다른 특징을 가진 인스턴스가 만들어집니다.

 

예시 )

철수와 영희 모두 사람이기 때문에 이족보행을 한다는 공통된 성격을 갖는다.

하지만 철수는 남자 20세, 영희는 여자 30세의 다른 특징을 갖는다.

 

객체(Object), 인스턴스(Instance)

클래스는 매뉴얼(설계도)이기 때문에 그 자체로는 객체로서 사용할 수 없습니다. 클래스로부터 객체를 생성하여 메모리 영역에 올려야 사용이 가능해지죠.

이렇게 메모리에 올리는 과정을 인스턴스화라고 하고, 생성된 객체를 인스턴스라고 부릅니다. 보통 특정 클래스에서 생성된 객체를 말할 땐 인스턴스라고 표현합니다.

 

클래스 : 설계도, 객체 : 건물, 인스턴스 : 서울시 강남구 oo빌딩


객체의 구성요소 - 속성, 기능 (객체의 멤버) 

속성(property)

멤버변수(member variable), 특성(attribute), 필드(field), 상태(state)로도 불립니다.

예시 ) 철수의 나이, 성별, 직업

 

클래스 변수(static) 

클래스가 메모리에 올라갈 때 생성되는 변수입니다. 한 클래스의 모든 인스턴스들이 공통적인 값을 유지해야 할 때 사용하는 속성입니다. 인스턴스를 생성하지 않고도 클래스이름.클래스변수 형식으로 접근할 수 있습니다.

 

인스턴스 변수

인스턴스가 생성되었을 때 생성되는 변수입니다. 인스턴스마다 고유한 상태를 유지해야 할 때 사용하는 속성입니다. 인스턴스를 생성해야만 사용할 수 있습니다. 

 

기능(function)

메서드(method), 함수(function), 행위(behavior)로도 불립니다.

예시 ) 철수가 하는 행동 : 블로그 포스팅, 개발, 유튜브 시청

 

메서드 선언과 구현

반환타입 메서드이름 (타입 매개변수명, 타입 매개변수명, ...) {	// 선언부      
    // 메서드 호출 시 수행 될 코드     				// 구현부
    return 반환값;                                       
}
  • 메서드는 input에 따른 output를 배출하는 로직입니다. input과 output이 모두 생략될 수 있으나 메서드가 동작되면 특정한 처리( 구현부 {} 안에 작성한 코드의 실행 )가 이루어집니다.
  • 메서드 이름 옆의 () 안에 input인 매개변수를 넣고 반환값을 return 해 줍니다.
  • 반환값이 없는 경우 return문은 생략이 가능하고, 반환타입은 void가 됩니다.
  • 변수들과 마찬가지로 static 메서드 선언이 가능합니다. 클래스 변수와 같이 인스턴스 생성 없이도 클래스명.메서드명() 으로 사용이 가능합니다.
  • 같은 클래스 안에서는 인스턴스 생성 없이도 다른 메서드에 접근할 수 있습니다. 다만, static메서드에서는 같은 클래스 내의 인스턴스 변수, 메서드에 접근할 수 없습니다. static메서드는 인스턴스 생성 없이도 사용이 가능해야 하는데, 인스턴스 변수와 메서드는 인스턴스 생성 시에만 사용할 수 있기 때문입니다.

재귀호출

메서드 내부에서 메서드 자신을 다시 호출하는 것입니다.

void method () {
	method();
}
  •  반복문보다 재귀호출의 수행시간이 더 오래 걸리지만 직관적인 표현이 가능하기 때문에 사용합니다.

오버로딩

한 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것입니다. 하나의 메서드 이름으로 매개변수만 다르게 넣어 비슷한 기능을 수행할 수 있도록 할 수 있습니다. 

int plus(int a, int b) { 
	return a + b;
}

int plus(int a, int b, int c) {
	return a + b + c;
}

float plus(float a, float b) {
	return a + b;
}
  • 메서드 이름이 같아야 합니다.
  • 매개변수의 개수 또는 타입이 달라야 합니다.

기본형 매개변수 / 참조형 매개변수

매개변수의 타입이 기본형일 때 기본형 매개변수, 참조형일 때 참조형 매개변수로 구분됩니다. 

기본형 매개변수는 변수의 값을 읽기만 할 수 있지만, 참조형 매개변수는 변수의 값을 읽고 변경할 수 있습니다.

가변인자

매개변수 개수를 동적으로 지정하는 기능입니다. (JDK1.5부터 사용 가능합니다.)

타입... 변수명(이 변수명이 배열의 이름이 됩니다.)
String concatenate(String... str) {...}
concatenate();
concatenate("a"); 
concatenate("a", "b");
concatenate(new String[]{"A","B"});

// 모두 가능합니다.
  • 가변인자 외에도 매개변수가 더 있다면, 가변인자를 가장 마지막에 선언해야 합니다.
  • 가변인자를 선언한 메서드는 오버로딩하지 않는 것이 좋습니다.
  • 메서드 내부에서는 매개변수들이 str이라는 배열로 만들어져 사용됩니다.

 


간단한 클래스를 하나를 만들어 볼까요?

class Person {
    static String status = "ALIVE";
    int age;
    String job;
    String gender;
    
    void post() {
    	System.out.println("블로그 포스팅 중");
    }
}

 

인스턴스의 생성과 사용

클래스명 변수명;
변수명 = new 클래스명();

Person chulsu; 
chulsu = new Person(); 

Person chulsu = new Person(); // 동시에 선언, 생성 가능

chulsu.age = 30; // 속성(멤버변수) 에 접근
chulsu.post(); // 기능(메서드) 호출

인스턴스는 참조변수를 통해서만 다룰 수 있으며, 참조변수의 타입은 인스턴스의 타입과 일치해야 합니다.

객체 배열

저번글에서 배열에 대해 알아봤었는데 기억하시나요? 자료형에 클래스명을 입력해 객체를 담을 수 있는(엄밀히 말하면 객체의 주소를 담습니다.) 배열을 만들 수 있습니다.

Person[] personArr = new Person[3];
personArr[0] = new Person();
personArr[1] = new Person();
personArr[2] = new Person();
// 초기화 해주어야 사용할 수 있습니다.

Person[] personArr ={ new Person(), new Person(), new Person()};

// 이처럼 한번에 초기화하는 것도 가능합니다.

이번 글에서는 클래스와 객체에 대해 작성했습니다. 다음 글에서는 이어서 인스턴스를 만드는 클래스의 생성자에 대해 설명하겠습니다.

 

자바 쉽게 배우기 7 - 생성자

클래스로 인스턴스를 만들기 위해서는 클래스에 적절한 생성자가 구현되어 있어야 합니다. 생성자를 만들고 사용하는 법을 알아봅시다. 생성자 Constructor 생성자 모든 클래스에는 생성자가 포함

devdharu.tistory.com