[Java 10] 자바 - 클래스
학습목표
- 클래스의 선언과 생성을 정확히 알고 있다.
- 클래스 구성멤버들의 특징을 정확히 알고 있다.
클래스
클래스 선언에서 생성까지 예제를 통해 차근차근 익혀봅시다.
[Student.java] 클래스 선언
public class Student {
}
[StudentExaple.java] 클래스로부터 객체 생성
public class StudentExample {
public static void main(String[] args) {
// new 연산자 사용한 만큼 객체가 생성, s1과 s2는 완전히 독립된 서로 다른 객체
Student s1 = new Student(); //인스턴스 변수
System.out.println("s1 변수가 Student 객체를 참조합니다.");
Student s2 = new Student(); //인스턴스 변수
System.out.println("s2 변수가 또 다른 Student 객체를 참조합니다.");
}
}
이처럼 StudentExample에서 new 연산자를 통해 s1, s2라는 2개의 객체가 생성되었고, 이 두 객체는 완전히 독립된 서로 다른 객체입니다. 여기서 Student와 StudentExample 클래스가 어떤 차이점을 가지는지 알 필요가 있습니다. 하나는 라이브러리(API : Application Program Interface)용이고 다른 하나는 실행용입니다. 라이브러리 클래스는 다른 클래스에서 이용할 목적으로 설계가 됩니다. 프로그램 전체에 클래스가 100개라면 99개는 라이브러리이고 단 하나가 실행 클래스입니다. 실행 클래스는 프로그램의 진입점인 main()메소드를 제공하는 역할을 합니다.
클래스의 구성 멤버
- 필드(Field)
- 생성자(Constructor)
- 메소드(Method)
public class ClassName {
// 필드
int fieldName
// 생성자
ClassName() {...}
// 메소드
void methodName() {...}
}
1. 필드(Field, 멤버변수)
객체의 데이터가 저장되는 곳입니다. 필드와 변수의 차이점은 변수는 생성자와 메소드 내에서만 사용되고 생성자와 메소드가 실행 종료되면 자동 소멸됩니다. 그러나 필드는 생성자와 메소드 전체에서 사용되며 객체가 소멸되지 않는 한 소멸되지 않습니다. 필드 선언은 중괄호 블록 {} 어디에서나 존재할 수 있지만, 생성자와 메소드 중괄호 블록 내부에는 선언될 수 없습니다. 생성자와 메소드 내부에 선언된 것은 모두 지역변수(Local variable)가 됩니다.
필드 사용
public class Car {
String company = "현대자동차"
String model = "k5"
String color = "흰색"
int maxSpeed = 300;
int speed;
}
public class CarExample {
public static void main(String[] args) {
Car mycar = new Car();
System.out.println("제작회사 : " + company);
System.out.println("모덿명 : " + model);
System.out.println("색상 : " + color);
System.out.println("최고속도 : " + maxSpeed);
System.out.println("현재속도 : " + speed);
myCar.spped = 60;
System.out.println("수정된 속도 :" + mycar.speed);
}
실행결과
제작회사 : 현대자동차
모델명 : k5
색상 : 흰색
최고속도 : 300
현재속도 : 0
수정된 속도 : 60
2. 생성자(Constructor)
생성자는 new 연산자로 호출되는 특별한 중괄호 {} 블록입니다. 생성자는 객체 생성 시 초기화를 해주는 역할입니다. 필드를 초기화하거나, 메소드를 호출해서 객체를 사용할 준비를 하게 합니다.
기본 생성자
public class Car {
Car myCar = new Car();
}
생성자 선언
[Car.java] 생성자 선언
public class Car {
Car(String color, int cc) {
}
}
[CarExample.java] 선언한 생성자 호출해서 객체 생성
public class CarExample {
public static void main(String() args) {
Car myCar = new Car("검정", 3000);
}
}
필드 초기화
클래스로부터 객체가 생성될 때 필드는 기본 초기값으로 자동 설정됩니다. 다른 값으로 초기화하고 싶다면 두가지 방법이 있는데,
1. 필드를 선언할 때 초기값을 주는 방법
==> 동일한 클래스로부터 생성되는 객체들은 모두 같은 데이터를 갖는다.
Korean 클래스에 nation 필드를 선언하면서 “대한민국”으로 초기값을 준 경우, k1과 k2 객체를 생성하면 k1과 k2 필드의 nartion 필드에는 모두 “대한민국”이 저장됩니다.
public class Korean {
String nation = "대한민국";
String name;
String ssn;
}
public class KoreanExaple {
public static void main(String[] args) {}
Korea k1 = new korean();
Korea k1 = new korean();
}
}
2. 생성자에서 초기값을 주는 방법
==> 객체 생성 시점에 외부에서 제공되는 다양한 값들로 초기화가 가능하다.
public class Korean {
//필드
String nation = "대한민국";
String name;
String ssn;;
//생성자
public Korean(String name, String ssn) {
this.name = name;
this.ssn = ssn;
}
}
public class KoreanExaple {
public static void main(String[] args) {}
Korea k1 = new korean("박자바", "010125-1234567");
System.out.println("k1.name : " + k1.name);
System.out.println("k1.ssn : " + k1.ssn);
Korea k2 = new korean("홍자바", "030224-1234567");
System.out.println("k2.name : " + k2.name);
System.out.println("k2.ssn : " + k2.ssn);
}
}
k1.name : 박자바
k1.ssn : 010125-1234567
k2.name : 홍자바
k1.ssn : 030224-1234567
생성자 오버로딩(Overloading)
public class Car {
Car() {...}
Car(String model) {...}
Car(String model, String color) {...}
Car(String model, String color, int maxSpeed) {...}
}
예제
생성자의 오버로딩
public class Car {
String company = "현대자동차";
String model;
String color;
int maxSpeed;
//생성자
Car() {
}
Car(String model) {
this.model = model;
}
Car(String model, String color) {
this.model = model;
this.color = color;
}
Car(String model, String color, int maxSpeed) {
this.model = model;
this.color = color;
this.maxSpeed = maxSpeed;
}
}
객체 생성 시 생성자 선택
public class CarExample {
public static void main(String[] args) {
Car car1 = new Car();
System.out.println("car1.compay : " + car1.company);
System.out.println();
Car car2 = new Car("자가용");
System.out.println("car2.company :" + car2.company);
System.out.println("car2.model :" + car2.model);
System.out.println();
Car car3 = new Car("트럭", "빨강");
System.out.println("car3.company :" + car3.company);
System.out.println("car3.model :" + car3.model);
System.out.println("car3.color :" + car3.color);
System.out.println();
Car car4 = new Car("택시", "흰색", 200);
System.out.println("car4.company :" + car4.company);
System.out.println("car4.model :" + car4.model);
System.out.println("car4.color :" + car4.color);
System.out.println("car4.maxSpeed :" + car4.maxSpeed);
}
}
실행결과
car1.compay : 현대자동차
car2.company :현대자동차
car2.model :자가용
car3.company :현대자동차
car3.model :자가용
car3.color :빨강
car4.company :현대자동차
car4.model :택시
car4.color :검정
car4.maxSpeed :200
다른 생성자 호출(this())
생성자 오버로딩이 많아질 경우 생성자 간의 중복된 코드가 발생할 수 있습니다. 이 경우 필드 초기화 내용은 한 생성자에만 집중적으로 작성하고 나머지 생성자는 초기화 내용을 가지고 있는 생성자를 호출하는 방법으로 개선할 수 있습니다.
다른 생성자 호출을 통한 중복 코드 줄이기
public class Car {
String company = "현대자동차";
String model;
String color;
int maxSpeed;
Car() {
}
Car(String model) {
this(model, "은색", 250);
}
Car(String model, String color) {
this(model, color, 250);
}
// 공통 실행 코드
Car(String model, String color, int maxSpeed) {
this.model = model;
this.color = color;
this.maxSpeed = maxSpeed;
}
}
객체 생성 시 생성자 선택
public class CarExample {
public static void main(String[] args) {
Car car1 = new Car();
System.out.println("car1.compay : " + car1.company);
System.out.println();
Car car2 = new Car("자가용");
System.out.println("car2.company :" + car2.company);
System.out.println("car2.model :" + car2.model);
System.out.println();
Car car3 = new Car("자가용", "빨강");
System.out.println("car3.company :" + car3.company);
System.out.println("car3.model :" + car3.model);
System.out.println("car3.color :" + car3.color);
System.out.println();
Car car4 = new Car("택시", "검정", 200);
System.out.println("car4.company :" + car4.company);
System.out.println("car4.model :" + car4.model);
System.out.println("car4.color :" + car4.color);
System.out.println("car4.maxSpeed :" + car4.maxSpeed);
}
}
3. 메소드(Method)
메소드는 다룰 내용이 많아 다음 포스팅 [Java 11] 자바 - 메소드에서 자세히 알아보도록 하겠습니다.
댓글남기기