- 사전적 의미로 객체는 [의사나 행위가 미치는 대상]입니다.
- 눈에 보이는 건물, 자동차, 사람도 객체가 될 수 있고, 보이지 않는 공기, 혹은 주문, 관리 등의 행동도 객체가 될 수 있습니다.
- 자바는 객체 지향 프로그래밍(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로 처리합니다.
- 멤버변수와 메서드는 첫 글자를 소문자로 쓰는 것이 관례입니다.
- 일단 문법적인 것만 설명하고, 메서드는 다음 강좌에서 함수와 메서드 개념으로 다시 보겠습니다.
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 |
- 클래스와 객체에 대한 더 자세한 설명은 다음 강좌에서 이어서 나가 보겠습니다.
'컴퓨터언어 > JAVA(자바)' 카테고리의 다른 글
[JAVA강좌] 23강 접근제어자와 정보은닉 (0) | 2024.01.17 |
---|---|
[JAVA강좌] 22강 메서드와 게터세터 (0) | 2024.01.17 |
[JAVA강좌] 20강 자바기본문법으로 게임제작하기 - 업다운게임 (0) | 2024.01.16 |
[JAVA강좌] 19강 반복문관련 - break와 continue (0) | 2024.01.15 |
[JAVA강좌] 18강 반복문 - for문 (0) | 2024.01.11 |