본문 바로가기

컴퓨터언어/JAVA(자바)

[JAVA강좌] 21강 클래스와 객체

728x90
반응형

 

 

 

 

 

- 사전적 의미로 객체는 [의사나 행위가 미치는 대상]입니다.

- 눈에 보이는 건물, 자동차, 사람도 객체가 될 수 있고, 보이지 않는 공기, 혹은 주문, 관리 등의 행동도 객체가 될 수 있습니다.

- 자바는 객체 지향 프로그래밍(Object-Oriented Programming: OOP) 언어입니다.

- 객체 지향 프로그램은 어떤 대상을 가지고 프로그래밍한다고 생각하면 좀 더 편합니다. 

- 현실 세계의 객체를 컴퓨터 세계의 객체로 변경한다고 생각하면 됩니다.

- 그 객체에 대한 설계도(원본)를 만드는 것을 클래스라고 합니다. 

 

 

 

 

 

 

 

 

 

 

 

1. 클래스란?


- 객체지향 프로그래밍 언어들은 클래스를 기반으로 프로그래밍합니다.

- 클래스는 객체의 설계도입니다. 

- 예를 들어 자동차를 만든다고 보면, 한대만 제작할 건 아니겠죠?

- 그래서 설계도를 만들어 공장에 보내 여러 대를 생산합니다.

- 자바에서는 이때의 설계도를 클래스라고 보면 됩니다.

- 이때 객체를 생성하기 위해서는 멤버변수와 메서드가 필요합니다. 

- 객체를 만들기 위해 설계도의 특징이나 기능을 명시해 주는 겁니다.

 

 

 

 

1) 멤버 변수

- 현대에서 자동차를 만든다고 보도록 하겠습니다.

- 자동차에 대한 설계를 할 때, 자동차명도 필요하고, 주유를 가솔린으로 할지, 경유로 할지도 지정을 합니다.

- 그리고 자동차색은 어떤 것을 할지 지정을 해야겠죠?

- 자동차에 대한 상세 스펙을 정의해 주는 것이 멤버 변수입니다.

네이버에서 캐스퍼 검색하면 나오는 상페 스펙

- 그래서 다른 언어들에서는 멤버변수를 속성(Property), 특성(Attribute)라고도 부릅니다.

- 객체가 가진 특징을 기술한 것입니다. 

 

 

 

 

## 클래스 정의 문법

(접근제어자) class 클래스명 {
	멤버변수;
    	메서드;
}

 

- 접근제어자는 우리가 그동안 봤던 public 같은 것들을 의미합니다. 

- 아래에서 더 자세히 볼 겁니다. 

- class는 키워드(예약어)입니다. 변수명으로 쓰면 안 되겠죠?

- 클래스명은 에러가 나는 규칙은 아니지만, 개발자들끼리의 관례가 있습니다.

- 첫 글자를 대문자로 작성하는 겁니다. 

- 첫글자를 소문자로 써도 오류가 발생하는 것은 아니지만, 대문자로 쓰는 것이 좋습니다.

- 그래야 개발자들끼리 코딩할 때 읽기가 더 편하기 때문입니다.(Coding Convension)

 

- 그럼 간단하게 클래스를 생성해 보겠습니다.

- ch14_class_object 패키지에서 Car01 이라는 클래스를 생성하겠습니다.

- 패키지는 간단히 말하면 클래스 파일의 묶음입니다.

- 패키지를 만들면 프로젝트 하위에 물리적으로 디렉터리(폴더)가 생성이 됩니다.

- 그리고 이번에는 main메서드를 체크하지 않고 해 보겠습니다. 

- 그럼 기본적으로 클래스를 구성하는 코드는 나옵니다.

 

 

## Car.java 기본 코드

package ch14_class_object;

public class Car {

}

 

- 이건 작성하지 않아도 자동으로 나옵니다.

 

 

## Car.java - 멤버변수 추가 코드

package ch14_class_object;

public class Car {
	String name;		//자동차명
	String color;		//색상
	String fuel;		//연료
	int year;		//생산년도
	double mileage;		//연비
}

- 여러 가지 멤버변수를 선언해 봤습니다. 

- 멤버변수 선언 시 앞에 자료타입을 작성해 주면 됩니다. 

- 기본 자료타입으로 선언할 수도 있고, 또 다른 클래스(참조형)로도 선언할 수 있습니다. 

 

 

 

 

 


 

 

 

 

2) 메서드(Method)

- 멤버변수는 객체가 갖은 특징을 기술하는 것이라면, 메서드는 동작을 기술하는 것입니다.

- 예를 들어 사람이라는 객체가 있을 때, 성별을 기술한다고 보겠습니다.

- 사람에게 여자가 되어라! 남자가 되어라! 할 수는 없잖아요? 

- 즉, 성별은 명령이 될 수는 없죠. 이런 것들은 멤버변수입니다.

- 하지만 사람은 이동할 수 있는 동작을 갖고 있습니다.

- 홍길동 씨, 이동하세요!라고 할 수 있죠? 그렇기 때문에 이동은 메서드가 됩니다.

- 물론, 멤버변수를 통해 메서드를 컨트롤할 수는 있습니다.

- 여자면 왼쪽으로 이동하고, 남자면 오른쪽으로 이동해라라고 할 수는 있습니다.

- 그래서 다시 정리하면 멤버변수는 객체가 갖는 고유한 특징을 기술하는 것이고, 메서드는 객체가 갖는 동작을 기술한다고 보면 됩니다.

 

 

## 클래스의 메서드 문법

(접근제어자) class 클래스명 {
	멤버변수;
    
        (접근제어자) 자료타입 메서드명() {

        }
}

 

 

## Car.java - 메서드 추가 코드

package ch14_class_object;

public class Car {
	String name;
	String color;
	String fuel;
	int year;
	double mileage;
	
	public void carInfo() {
		System.out.println("자동차명: " + name);
		System.out.println("색상: " + color);
		System.out.println("연료: " + fuel);
		System.out.println("생산년도: " + year);
		System.out.println("연비: " + mileage);
	}
}

- 접근제어자는 public으로 작성했습니다.

- 자료 타입이 없는 경우는 void로 처리합니다.

- 멤버변수와 메서드는 첫 글자를 소문자로 쓰는 것이 관례입니다. 

- 일단 문법적인 것만 설명하고, 메서드는 다음 강좌에서 함수와 메서드 개념으로 다시 보겠습니다.

 

 

 

 

 

 

 

 

 

 

728x90
반응형

 

 

 

 

 

 

 

 

 

 

 

2. 인스턴스란?

- 클래스를 객체의 설계도라고 하면, 인스턴스는 그 설계도로 구현된 실제 객체입니다.

- 둘 다 객체 개념이긴 하지만, 둘 다 객체로 부른다면 헷갈리겠죠?

- 클래스는 원본이고 인스턴스는 복제본과 같은 개념으로 보면 됩니다.

 

 

 

1) main() 함수에 인스턴스 생성

- 그럼 main() 함수에 인스턴스를 생성해 보도록 하겠습니다.

- main() 함수는 자바 가상 머신(Java Virtual Machine:JVM)이 프로그램을 시작하기 위해 호출하는 함수입니다.

- 클래스 내부에 만들기는 하지만, 클래스의 메서드는 아닙니다.

- 이전 강좌까지 클래스 생성 시 체크해서 처음부터 생성했던 함수입니다. 

 

## main() 함수 코드

public static void main(String[] args) {

}

- 많이 봤던 코드죠?

- main() 함수는 우리가 만든 파일에 직접 만드는 방법이 있고, 다른 테스트용 클래스를 만들어서 사용하는 경우가 있습니다.

- 외부에 다른 테스트용으로 만드는 작업은 앞으로도 많이 할 예정이므로, 지금 예제해서는 우리가 만든 Car.java에 main() 함수를 직접 작성해서 사용해 보겠습니다.

 

 

## 인스턴스 생성 문법

클래스명 인스턴스변수명 = new 생성자();

 

- 생성자는 아래에서 더 자세해 볼 겁니다. 

- 지금은 클래스명이라고 보면 됩니다.

- 우리가 현재 자동차 클래스를 생성했는데, 우빈이도 차를 사고, 제니도 차를 살 수 있는 거잖아요? 

- 그래서 각각 자동차를 인스턴스로 생성하는 겁니다. 

 

 

 

## Car.java - 인스턴스 추가 코드

package ch14_class_object;

public class Car {
	String name;
	String color;
	String fuel;
	int year;
	double mileage;
	
	public void carInfo() {
		System.out.println("자동차명: " + name);
		System.out.println("색상: " + color);
		System.out.println("연료: " + fuel);
		System.out.println("생산년도: " + year);
		System.out.println("연비: " + mileage);
	}
	
	public static void main(String[] args) {
		//우빈 차 생성
		Car ubinCar = new Car();
		ubinCar.name = "싼타페";
		ubinCar.color = "검정색";
		ubinCar.fuel = "경유";
		ubinCar.year = 2024;
		ubinCar.mileage = 9.7;
		
		//우빈 차 정보 출력
		ubinCar.carInfo();
		
		System.out.println("==============");
		
		//제니 차 생성
		Car jenyCar = new Car();
		jenyCar.name = "캐스퍼";
		jenyCar.color = "빨간색";
		jenyCar.fuel = "가솔린";
		jenyCar.year = 2024;
		jenyCar.mileage = 12.3;
		
		//제니 차 정보 출력
		jenyCar.carInfo();
	}
}

- main() 함수 내부에 ubinCar와 jenyCar를 생성해 봤습니다. 

- 생성하고 각각의 멤버변수에 값을 할당해 줬고, 메서드를 호출했습니다.

 

 

## Car.java - 인스턴스 추가 결과

- 그럼 결과 도출이 잘 되는 것이 확인됩니다. 

 

 

## 클래스와 인스턴스

클래스와 인스턴스의 관계를 그림으로 표현

 

 

 

 

 

 

 

 

 


 

 

 

 

2) 생성자(Constructor)

- 생성자는 클래스를 인스턴스로 생성할 때 사용하는 함수를 말합니다.

- 클래스의 멤버변수는 메서드에 의해 값이 변경될 수도 있지만, 처음 클래스를 생성할 때 값을 정해야 하는 경우도 있습니다. 

- 생성자가 하는 일은 클래스를 처음 만들 때, 멤버변수나 상수를 초기화하는 것입니다. 

- 근데 우리가 위에서 인스턴스를 생성할 때 생성자를 만든 적이 없는데, 인스턴스가 생성되었죠?

- 이건 컴파일러가 클래스를 컴파일할 때 자동으로 생성자를 만들어 줍니다. 

- 이렇게 자동으로 생성되는 생성자를 기본 생성자(Default Constructor)라고 합니다.

 

 

## 기본 생성자 문법

public 클래스명 () { }

 

 

## Car.java - 기본 생성자 추가 코드

package ch14_class_object;

public class Car {
	String name;
	String color;
	String fuel;
	int year;
	double mileage;
	
	public void carInfo() {
		System.out.println("자동차명: " + name);
		System.out.println("색상: " + color);
		System.out.println("연료: " + fuel);
		System.out.println("생산년도: " + year);
		System.out.println("연비: " + mileage);
	}
	
	//기본생성자 - 생략해도 컴파일러가 만들어줌
	public Car() { }
	
	
	public static void main(String[] args) {
		//우빈 차 생성
		Car ubinCar = new Car();
		ubinCar.name = "싼타페";
		ubinCar.color = "검정색";
		ubinCar.fuel = "경유";
		ubinCar.year = 2024;
		ubinCar.mileage = 9.7;
		
		//우빈 차 정보 출력
		ubinCar.carInfo();
		
		System.out.println("==============");
		
		//제니 차 생성
		Car jenyCar = new Car();
		jenyCar.name = "캐스퍼";
		jenyCar.color = "빨간색";
		jenyCar.fuel = "가솔린";
		jenyCar.year = 2024;
		jenyCar.mileage = 12.3;
		
		//제니 차 정보 출력
		jenyCar.carInfo();
	}
}

 

- 어디에 넣는지 보기 위해 한번 생성해 봤습니다.

- 생성자를 개발자가 디테일하게 만들 수 있습니다.

- 위의 코드를 보면 우빈 차와 제니차 만들 때 멤버변수를 5줄씩 매번 써야 하는 불편함이 있었습니다.

- 이것은 인스턴스로 생성할 때 매개변수로 처리하게 해 주면 코드가 10줄은 줄어듭니다.

 

 

 

## Car.java - 멤버변수를 생성자의 매개변수로 처리한 코드

package ch14_class_object;

public class Car {
	String name;
	String color;
	String fuel;
	int year;
	double mileage;
	
	public void carInfo() {
		System.out.println("자동차명: " + name);
		System.out.println("색상: " + color);
		System.out.println("연료: " + fuel);
		System.out.println("생산년도: " + year);
		System.out.println("연비: " + mileage);
	}
	
	//매개변수를 사용한 생성자
	public Car(String cname, String ccolor, String cfuel, int cyear, double cmileage) {
		//매개변수 값을 각각의 멤버변수에 대입
		name = cname;
		color = ccolor;
		fuel = cfuel;
		year = cyear;
		mileage = cmileage;
	}
	
	
	public static void main(String[] args) {
		//우빈 차 생성
		Car ubinCar = new Car("싼타페","검정색","경유", 2024, 9.7);
		
		//우빈 차 정보 출력
		ubinCar.carInfo();
		
		System.out.println("==============");
		
		//제니 차 생성
		Car jenyCar = new Car("캐스퍼","빨강색","가솔린", 2024, 12.3);
		
		//제니 차 정보 출력
		jenyCar.carInfo();
	}
}

 

 

- 매개변수를 사용한 생성자를 만드니까, main() 함수 내부에 인스턴스를 생성할 때 한 줄로 간단해집니다. 

- 결과는 위와 같기 때문에 따로 보여드리진 않겠습니다. 

 

 

 


 

 

 

3) this 키워드

- this는 생성된 인스턴스 스스로를 가리키는 예약어입니다. 

- this는 클래스가 자신의 코드블록 { } 내부에서 자신을 호출할 때 사용하는 키워드입니다. 

- 클래스에 생성된 멤버변수는 모든 인스턴스가 가져다 씁니다.

- 그러다 보니 이름 선정 시 헷갈릴 수 있습니다. 

- 그래서 인스턴스가 자신의 멤버변수를 호출할 때 this키워드를 같이 사용합니다.

- 예를 들어, 소희가 자신의 핸드폰을 잃어버렸다고 보겠습니다.

- 이때 소희가 "소희 핸드폰 어딨어?"라고 했다고 보겠습니다. 

- 그럼 두 가지 문제점이 발생이 됩니다.

- 첫 번째는 소희가 귀여운 척을 하면서 자기를 삼자화했다는 겁니다. => 농담입니다.

- 실제로 여기서의 문제점은 소희라는 사람이 또 있을 수 있다는 겁니다. 

- 그래서 보통 우리가 말할 때, "내 핸드폰 어딨어?"라고 하죠.

- 이때 사람들이 나의, 내, 이런 식으로 말하는 것을 this라고 생각하면 편합니다. 

- 보통 생성자를 만들 때 매개변수와 멤버변수명을 같게 합니다. 

- 그럼 프로그램이 개발자가 어떤 변수를 선택했는지 모르겠죠? 

- 그래서 멤버변수 앞에 this를 붙여줘서 매개변수와 멤버변수를 구분합니다.

- 그럼 위의 코드를 변경해 보겠습니다. 

 

 

## Car.java - 멤버변수를 this키워드로 처리한 코드

package ch14_class_object;

public class Car {
	String name;
	String color;
	String fuel;
	int year;
	double mileage;
	
	public void carInfo() {
		System.out.println("자동차명: " + name);
		System.out.println("색상: " + color);
		System.out.println("연료: " + fuel);
		System.out.println("생산년도: " + year);
		System.out.println("연비: " + mileage);
	}
	
	//매개변수를 사용한 생성자 
	public Car(String name, String color, String fuel, int year, double mileage) {
		//매개변수 값을 각각의 멤버변수에 대입
		this.name = name; //멤버변수 = 매개변수
		this.color = color;
		this.fuel = fuel;
		this.year = year;
		this.mileage = mileage;
	}
	
	
	public static void main(String[] args) {
		//우빈 차 생성
		Car ubinCar = new Car("싼타페","검정색","경유", 2024, 9.7);
		
		//우빈 차 정보 출력
		ubinCar.carInfo();
		
		System.out.println("==============");
		
		//제니 차 생성
		Car jenyCar = new Car("캐스퍼","빨강색","가솔린", 2024, 12.3);
		
		//제니 차 정보 출력
		jenyCar.carInfo();
	}
}

 

- 생성자에 보면 [ this.name = name; ]이라고 작성했습니다.

- 만약에 [ name = name; ] 라고 쓰면 프로그램이 헷갈리겠죠?

- 그래서 this.name은 클래스가 갖은 멤버변수를 의미, name은 매개변수를 의미합니다.

- 하지만 모든 클래스(객체)가 인스턴스를 생성할 때 같은 값을 갖나요?

- 그렇지 않죠? 그렇기 때문에 나의 이름은 싼타페다!, 나의 이름은 캐스퍼다! 라고 해주는 겁니다. 

 

 

 

 

 


 

 

 

 

4) 생성자 오버 로드(Constructor Overload)

- 클래스에 생성자가 2개 이상 제공되는 것을 생성자 오버로드라고 합니다.

- 필요에 의해 매개변수 개수가 다른 생성자를 여러 개를 만들 수 있습니다.

- 인스턴스 생성 시 다양한 경우에 대비해 초기화하기 위해 사용됩니다. 

 

 

## Car.java - 생성자 오버로드 처리 코드

package ch14_class_object;

public class Car {
	String name;
	String color;
	String fuel;
	int year;
	double mileage;
	
	public void carInfo() {
		System.out.println("자동차명: " + name);
		System.out.println("색상: " + color);
		System.out.println("연료: " + fuel);
		System.out.println("생산년도: " + year);
		System.out.println("연비: " + mileage);
	}
	
	//기본 생성자
	public Car() { }
	
	//색상만 매개변수를 사용한 생성자
	public Car(String color) {
		this.name = "캐스퍼";
		this.color = color;
		this.fuel = "가솔린";
		this.year = 2024;
		this.mileage = 12.3;
	}
	
	//모든 매개변수를 사용한 생성자 
	public Car(String name, String color, String fuel, int year, double mileage) {
		//매개변수 값을 각각의 멤버변수에 대입
		this.name = name; //멤버변수 = 매개변수
		this.color = color;
		this.fuel = fuel;
		this.year = year;
		this.mileage = mileage;
	}
	
	
	public static void main(String[] args) {
		//우빈 차 생성
		Car ubinCar = new Car("싼타페","검정색","경유", 2024, 9.7);
		
		//우빈 차 정보 출력
		ubinCar.carInfo();
		
		System.out.println("==============");
		
		//제니 차 생성
		Car jenyCar = new Car("캐스퍼","빨강색","가솔린", 2024, 12.3);
		
		//제니 차 정보 출력
		jenyCar.carInfo();
		
		System.out.println("==============");
		
		//유진 차 생성
		Car yujinCar = new Car("카키색");
		
		//유진 차 정보 출력
		yujinCar.carInfo();
	}
}

- 현대 자동차가 주력으로 하는 상품이 캐스퍼라고 보도록 하겠습니다.

- 그래서 색상만 선택하는 생성자를 추가했습니다.

- 그래서 유진 차를 인스턴스로 생성할 때, 색상만 작성한 것을 확인할 수 있습니다.

- 대신 다른 건 default로 처리를 합니다. 

- 물론 전부 선택한 것이 있으므로 세부적으로 변경하고 싶다면 값을 모두 작성하면 됩니다.

 

 

## Car.java - 생성자 오버로드 처리 결과

- 그럼 마지막에 카키색 캐스퍼도 잘 출력된 것을 확인할 수 있습니다.

 

 


 

 

 

 

5) 멤버변수의 초기값

- 위에서는 색상만 정의해도 다른 것들의 값이 들어가라고 프로그래밍했습니다.

- 하지만 [ this.name = "캐스퍼"; ] 이런 식으로 할당하지 않아도, 기본값으로 잘 처리가 됩니다.

 

## 멤버 변수의 자료형에 따른 초기 값

자료형 기본 값
boolean false
char '\u0000'
byte 0
short 0
int 0
long 0L
float 0.0F
double 0.0
참조형변수 null

 

 

- 클래스와 객체에 대한 더 자세한 설명은 다음 강좌에서 이어서 나가 보겠습니다. 

 

 

 

 

 

 

728x90
반응형