Java - 클래스를 통해 객체 생성해보기

|

개인적인 연습 내용을 정리한 글입니다.
더 좋은 방법이 있거나, 잘못된 부분이 있으면 편하게 의견 주세요. :)


앞서 자바 클래스에는 멤버변수와 메서드로 구성되어 있다고 언급했다.

그러면 클래스를 통해 객체를 생성하는 예제를 정리해보자.

클래스 생성

package oop1Pjt;

/*만약 내가 Grandeur라는 객체를 만든다고 할때,
public class Grandeur라고 해서 클래스를 먼저 만들어준다.
앞의 public은 접근제한자로, 바깥쪽에서 이 Grandeur를 다 사용할 수 있다고 하는것을 의미 (나중에 다시설명)*/

public class Grandeur { //클래스 이름: 첫글자는 대문자로
	// class 키워드를 이용해서 어떤 클래스를 만들겠다고 선언을하고 그 안에 속성들을 만들어주는데
	// 구성요소: 멤버변수(속성),메서드(기능), 생성자

	public String color; // 멤버변수(속성)
	public String gear; // 속성은 변수 만들듯이 자료형을 써주고 속성의 이름을 써준다.
	public int price;

	public Grandeur() { //생성자
		/* 이 클래스로부터 객체가 만들어질때, 가장먼저 호출되는곳
    생성자는 클래스의 이름과 동일하게 만들어주고, 생성을 할때 필요한 내용이 있다면 아래에 만들어주고 없을 경우 그냥 비워 놓아도 된다.*/
		System.out.println("Grandeur constructor");
	}

	public void run() { // 메서드(기능)
		/* 클래스로부터 생성된 객체가 하는 일(기능)을 만들어주는 게 메서드인데,
		이 메서드의 형태는 접근제한자(public), void, 메서드의 이름으로 이루어진다.
		void는 메서드를 호출한 곳에 어떤 데이터를 반환을 해줄때 그 데이터의 자료형을 어떤 것을 해줄지를 써주며 반환하는 값이 없을때  void를 사용

    만약 void가 아닌 string이라고 한다면 return이라는 키워드를 통해 "string"을 반환해줄 수 있다.
	  더이상 반환할 게 없을 경우 void라는 키워드를 사용 */
		System.out.println("-- run --");
		/* run이라는 메서드를 호출했을 때 수행할 수 있는 일을 기입 */
	}

	public void stop() {
		System.out.println("-- stop --");
	}

	public void info() {
		System.out.println("-- info --");
		System.out.println(" color: " +color);
		System.out.println(" gear: " +gear);
		System.out.println(" price: " +price);

	}
}

mainClass

  • Grandeur 클래스를 호출해 사용할 수 있게 mainClass 생성
  • JVM이 프로그램을 실행할때 가장먼저 접근하는 곳이 main method
    • 따라서 main method를 가지고있는 클래스를 만들어준다.
package oop1Pjt;

public class mainClass {

	public static void main(String[] args) {
		//여기서 Grandeur라는 클래스로부터 객체를 만들어본다.

		Grandeur myCar1 = new Grandeur();
		/* 클래스로부터 객체를 생성하는 방법은 new라는 키워드를 사용한다.
		 Grandeur 객체이름(닉네임) = new 클래스
		 ( Grandeur라는 클래스로부터  Grandeur라는 객체가 뽑아져나와 메모리에 탑재 )
		 new를 하자마자  Grandeur의 생성자가 호출되는 것 (메모리에 업로드)

		 new Grandeur() 얘로부터 메모리에 올라간 객체는
		 그것이 가리키고 있는 인스턴스/레퍼런스가 바로 myCar1 */

		myCar1.color = "red";
		// 그래서 myCar1.(접근자)를 통해서 접근을 할수가 있음
		// . 접근자를 이용해 color, gear 등 속성에 접근을 할수가 있음
		myCar1.gear = "auto";
		myCar1.price = 100;

		// 따라서 내가 지금 만든 객체의 색, 기어, 가격을 정해줄수 있음


		myCar1.run();
		// myCar1라는 객체의 기능을 가져옴
		myCar1.stop();
		myCar1.info();

		System.out.println();

		Bicycle myCar2 = new Bicycle();

		myCar2.color = "blue";
		myCar2.price = 150000;

		myCar2.info();
	}
}
  • 메모리상에 객체를 만들어놓는것 (Grandeur)
  • 객체를 만들어 놓고 이 객체가 있는 곳을 가리키는 주소(레퍼런스) -myCar1
  • myCar1에는 객체를 가리키는 주소만 가지고있고 실제는 빈껍데기
  • 진짜 객체는 Grandeur가 가지고 있음 (메모리 어딘가에 있음)

  • 만약 쓰다가 그 관계를 끊어내면, Grandeur라는 객체는 더이상 쓰여지지 않는것이고 그때 GC가 나타나 얘를 회수해감 (메모리 관리)

추가예제

class Bicycle - parameter 사용

  • 생성자는 꼭 하나일 필요가 없음
package oop1Pjt;

public class Bicycle {


	public String color;
	public int price;

	public Bicycle() {
		System.out.println(" Bicycle Constructor ");
	}

	public Bicycle(String c, int p) {
		// 객체가 생성될때 객체가 생성되는 곳에서 값을 받는다. -> c&p
		System.out.println(" Bicycle Constructor 2 ");

		this.color = c;
		// 내가 갖고 있는 객체를 가리킨다고 해서 this라는 키워드 사용
		// this의 컬러 (지금 이 객체의 컬러)에 c를 대입
		// c는 이 객체를 생성해줄때 생성자를 호출해주는 곳에서 값을 던져주는 것
		this.price = p;
		// p도 이 클래스를 호출해서 객체를 만들어주는 곳에서 값을 주는것
		// MainClass2 로 다시 이동
	}


	public void info() {
		System.out.println(" -- info -- ");
		System.out.println(" color:  " + color);
		System.out.println(" print:  " + price);
	}
}

class MainClass2

package oop1Pjt;

public class MainClass2 {

	public static void main(String[] args) {
		Bicycle mybicycle = new Bicycle();
		// new키워드를 통해 Bicycle의 생성자가 호출이 되는데
		// 위에 처럼 new bicycle()이라고해서 ()이 안에 아무 parameter를 넣지않고도 호출이 가능
		// 가장 기본적인 생성자라고 해서 얘를 default생성자 라고함.

		// 근데 이 방법만이 있는게 아님.
		// 생성자는 꼭 하나만 있을 필요가 없음  (Bicycle.java로 이동)

		mybicycle.color = "red";
		mybicycle.price = 100;

		mybicycle.info();

		Bicycle mybicycle2 = new Bicycle("blue", 200);
		mybicycle2.info();

		mybicycle2.color = "yellow"; //색이 변경된 경우
		mybicycle2.info();
		// 바뀌어서 나옴
	}

}