[Java 10] 자바 - 클래스

학습목표

  1. 클래스의 선언과 생성을 정확히 알고 있다.
  2. 클래스 구성멤버들의 특징을 정확히 알고 있다.

클래스

클래스 선언에서 생성까지 예제를 통해 차근차근 익혀봅시다.

[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()메소드를 제공하는 역할을 합니다.

클래스의 구성 멤버

  1. 필드(Field)
  2. 생성자(Constructor)
  3. 메소드(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] 자바 - 메소드에서 자세히 알아보도록 하겠습니다.

[Java 11] 자바 - 메소드

태그:

카테고리:

업데이트:

댓글남기기