본문 바로가기

JAVA/혼자공부하는자바

[JAVA] 클래스란?

728x90

프로그래밍에서 낱개의 자료를 저장하는 공간을 '변수(variable)'라고 한다.

 

이 때 같은 형식(자료형)의 여러 변수를 저장하는 공간을 '배열(array)' 이라고 한다.

 

여기서 여러 종류의 자료형 변수를 저장하는 공간을 '구조체(struct)'라고 하며 이는 C구조적 프로그래밍에서 중요한 요소이다.

 

이 구조체에서 파생된 것이 '클래스(class)'이며 다양한 자료형과 다양한 자료를 저장할 수 있으며 추가적으로 메서드 (함수)를 내장할 수 있다.

 

간단하게 작은 클래스를 만들어보자.

 


wikidocs.net/214

 

위키독스

온라인 책을 제작 공유하는 플랫폼 서비스

wikidocs.net

!점프 투 자바의 클래스 문서를 그대로 각색하여 작성함!


 

클래스란?

Car.java

public class Car {

}

Car 클래스를 선언했다. 선언만 있고 내용이 없다. 하지만 이 껍데기 뿐인 클래스도 객체(object)를 생성할 수 있다.

 

Car tesla = new Car();

객체는 이와 같이 만들 수 있다.

 

new 는 객체를 생성할 때 사용하는 키워드이다.

이렇게 하면 Car클래스의 객체인 tesla 인스턴스를 만들 수 있다.

 

※ 객체와 인스턴스
클래스에 의해서 만들어진 객체를 인스턴스라고도 한다. 그렇다면 객체와 인스턴스의 차이는 무엇일까? 이렇게 생각 해 보자. Car tesla = new Car() 이렇게 만들어진 tesla은 객체이다. 그리고 tesla라는 객체는 Car의 인스턴스(instance)이다. 즉 인스턴스라는 말은 특정 객체(Tesla)가 어떤 클래스(Car)의 객체인지를 관계위주로 설명할 때 사용된다. 즉, "Tesla는 인스턴스" 보다는 "Tesla는 객체"라는 표현이 어울리고 "Tesla는 Car의 객체" 보다는 "Tesla은 Car의 인스턴스" 라는 표현이 훨씬 잘 어울린다.

https://koc.chunjae.co.kr/Dic/dicDetail.do?idx=43505

  • 붕어빵틀 -> 클래스 (Class)
  • 붕어빵 -> 객체 (Object)

이 예시와 같이 하나의 클래스(설계도)를 통해 무수히 많은 종류의 붕어빵(팥붕어빵, 크림붕어빵, 피자붕어빵 등..)을 만들 수 있다는 것이다.

 

(Tesla, KIA, Volvo ... 등을 Car 클래스로 뽑아낼 수 있다는 뜻)

Car tesla = new Car();
Car kia = new Car();
Car volvo = new Car();
.....

 

위 내용을 이해했다면 클래스는 70% 이상 알았다고 해도 과언이 아니라고 한다.

 


 

객체 변수 (Instance variable)

Car 이라는 껍데기 클래스를 더 발전시켜 보자.

Car 클래스에 의해 만들어지는 차들에 색상을 정해주도록 해 보자.

이클립스를 열고 따라해보자

 

public class Car {
	
	String color;

}

Car 클래스에 color이라는 String 변수를 추가했다.

이렇게 클래스에 선언된 변수를 객체 변수라고 부른다. 또는 인스턴스 변수, 멤버 변수, 속성이라고도 말한다.

 

클래스에 의해 생성되는 것은 객체, 그리고 그 클래스에 선언된 변수는 객체 변수라고 생각하면 쉽다.

 

객체 변수도 변수이니 어떠 한 값을 담을 수 있을것이다.

 

객체 변수를 출력해보자.

 

객체.객체변수

객체 변수는 이와 같이 도트연산자(.)을 이용하여 접근할 수 있다.

 

즉 Car Tesla = new Tesla() 로 Tesla 객체를 생성했다면 이 Tesla 객체의 객체변수 color에는 다음과 같이 접근할 수 있다.

 

tesla.color // 객체: Tesla, 객체변수 : color

이제 객체 변수에 어떤 값이 담겼는지 출력해보자.

 

null이 출력된다.

아무 값도 할당되어 있지 않은 상태이다.

객체 변수로 color을 선언했지만 아무런 값도 대입을 하지 않았기 떄문에 null이 출력된것

 


 

메소드

객체 변수에 값을 대입하는 방법에 대해 알아보자.

 

객체 변수에 값을 대입하는 방법에는 여러가지가 있지만 가장 보편적인 메소드를 이용할 것이다.

 

서론에서 서술했듯이 클래스에는 자료를 저장하는것과 더불어 메소드(Method)라는 것이 있다.

메소드는 클래스 내 구현된 함수를 의미한다.

 

아래와 같이 setColor 메소드를 추가 해 보자.

public class Car {

	String color;

	public void setColor(String color) {
		this.color = color;
	}

	public static void main(String[] args) {
		Car tesla = new Car();
		System.out.println(tesla.color);
	}

}

Car 클래스에 추가된 setColor 메소드는 다음과 같은 형태의 메소드이다.

 

  • 입력 : String color
  • 출력 : void (리턴하지않음)

즉, 입력으로 color라는 문자열을 받고 출력은 없는 형태의 메소드이다.

(메소드의 입출력에 대한 자세한 내용은 다음 장에 준비되어 있다. 이해가 되지 않는다면 다음 장을 보고 오자.)

 

이번에는 setColor 메소드의 내부를 살펴보자. setColor 메소드는 다음의 문장을 가지고 있다.

this.color = color;

이 메소드를 호출하는 방법에 대해 알아보자.

 

객체 변수에 접근하기 위해서 객체.변수 와 같이 도트연산자(.)로 접근했던것 처럼

메소드에 접근하기 위해서는 객체.메소드로 호출할 수 있다.

 

 

tesla.setColor("red");

즉, setColor 메소드를 호출은 다음과 같다.

 

여기서 setColor 메소드의 입력으로 문자열을 전달하여야 한다.

setColor메소드는 입력항목 데이터 타입으로 문자열을 필요로 하기 때문이다.

 

setColor 메소드를 호출할 수 있도록 main메소드를 다음과 같이 수정하자.

 

public static void main(String[] args) {
  Car tesla = new Car();
  tesla.setColor("red"); //메소드 호출
  System.out.println(tesla.color);
}

이렇게 수정하고 다시 실행하면 setColor 메소드가 호출될 것이다.

 

 

this.color = color;

setColor 메소드안에 내용을 살펴보면 위 문장을 볼 수 있다.

여기서 this 라는 키워드를 이해하는 것이 중요하다.

 

main메소드에서 tesla.setColor의 입력값인 "red"로 setColor 메소드를 호출했기 때문에

setColor함수의 입력항목 color에는 "red" 문자열이 전달될 것이다.

 

따라서 setColor 메소드의 this.color = color; 문자열은

this.color = "red";

이와 같이 해석이 된다.

 

setColor 메소드 내부의 this 는 Car 클래스에 의해서 생성된 객체를 지칭한다.

만약 Car tesla = new Car() 와 같이 tesla라는 객체를 만들고

tesla.setColor("red")와 같이 tesla객체에 의해 setColor 메소드를 호출하면 setColor 메소드 내부에 선언된 this는 바로 tesla 객체를 지칭하게 된다.

 

만약 Car volvo = new Car()로 volvo 객체를 만든 후 volvosetColor("blue") 와 같이 호출한다면 setColor 메소드 내부에 선언된 this는 바로 volvo 객체를 지칭하게 된다.

 

따라서 this.color = "red"; 문장은 다시 다음과 같이 해석된다.

tesla.color = "red";

 

tesla.color 와 같이 하면 객체 변수에 접근할 수 있음을 우리는 알고 있다.

객체변수에 값을 대입하는 방법은 그냥 변수에 값을 대입하는 것과 마찬가지이다.

객체.객체변수 = 값

따라서 tesla.color = "red" 라는 문장은 tesla의 객체변수 color에 "red"라는 값을 대입하게 된다.

 

Car 클래스를 다시 실행해보면 null이 아닌 "red"가 출력된다.


객체 변수는 공유되지 않는다

 

main 메소드를 다음과 같이 변경 해 보자.

public static void main(String[] args) {
	Car tesla = new Car();
	tesla.setColor("red"); //메소드 호출
		
	Car volvo = new Car();
	volvo.setColor("blue");
 }

tesla객체에는 red, volvo객체에는 blue를 대입했다.

 

 

이럴 경우 setColor메소드에 의해 아래 문장이 2번 실행될 것이다.

tesla.color = "red";
volvo.color = "blue";

만약 Car 클래스의 객체변수 color가 tesla객체와 volvo객체간 공유되는 변수라면

volvo.color = "blue" 라는 문장이 뒤에 수행되므로 tesla.color의 값도 "blue"로 변경될 것이다.

 

확인해보자.

 

결과를 보면 color 객체 변수는 공유되지 않는다는 것을 확인할 수 있다.

 

이 부분은 아주 중요해 백만번 강조해도 지나치지 않다고 한다.

클래스에서 가장 중요한 부분은 뭐라해도 객체 변수의 값이 독립적으로 유지된다는 점이다.

이 부분이 클래스 존재의 이유이기도 하며 객체 지향적(Object Oriented)라는 말도 이 객체 변수의 값이 독립적이기 때문에 가능한 것.

 

(static 키워드를 이용하면 객체 변수를 공유하도록 할 수 있다.)