본문 바로가기
뒷북 정리 (국비 교육)/java

[Java] step06. Constructor

by 규글 2022. 4. 17.

step06. Constructor

- 01

/*
 *  [ Constructor(생성자) ]
 *  
 *  1. class 명과 동일하다
 *  2. method 모양과 유사 하지만 return type  이 없다.
 *  3. 객체를 생성할때(new 할 때) 호출된다. 
 *  4. 객체를 생성하는 시점에 무언가 준비 작업을 할때 유용하다.
 *  5. 생성자를 명시적으로 정의 하지 않아도 기본 생성자는 있다고 간주된다. 
 */
public class Student {
	// 생성자 (Constructor)
	public Student() {
		System.out.println("Student 클래스의 생성자 호출됨!");
	}
	
	public void study() {
		System.out.println("공부를 해요");
	}
	public void goSchool() {
		System.out.println("학교를 가요");
	}
}

 생성자는 영어로 Constructor 라고 하는데, 이미지 오른쪽의 '생성자' 라고 적힌 부분을 보자. 가장 먼저 보이는 특징은 class의 이름과 같다는 점이다. (1) 게다가 method인가 싶어도 return type이 적혀있지 않으며 심지어 void라고도 적혀있지 않다. (2) 이 생성자라는 친구는 new 를 사용해서 객체를 생성할 때 호출되는 곳이다. 이미지 왼쪽의 Student( )는 사실 Constructor를 호출하는 것이다. 그래서 실행 순서가 잠깐 이쪽으로 들어오게 되는 된다. (3) 때문에 생성과 동시에 무언가 사전작업 등을 하기 위해서 필요한 부분이라고 할 수 있다. (4) 게다가 이 친구는 저렇게 적어주지 않더라도, 기본 생성자는 존재하는 것으로 간주한다고 한다. (5)

 

- 02

public class Car {
	// field 
	public String name;
	
	// String type 을 전달 받는 constructor 
	public Car(String name) {
		// constructor의 인자로 전달 받은 값을 field에 저장하기
		this.name=name;
	}
	
	// method 
	public void drive() {
		System.out.println(this.name+" 이(가) 달려요");
	}
}

 

		// Car class로 객체를 생성해서 참조값을 c1 이라는 이름의 변수에 담아보세요.
		Car c1=new Car("소나타");
		Car c2=new Car("프라이드");
        
		// c1 에 담겨 있는 참조값을 이용해서 .drive()  method를 호출해 보세요.
		c1.drive();
		c2.drive();

 method에 인자를 전달하는 것처럼 constructor에도 인자를 전달할 수도 있다. 이렇게 전달된 값이나 local variable이 class의 field가 되어 해당 field를 이용해서 이어지는 작업을 가능하게 한다.

 

- 03

public class Computer {
	// field
	public Cpu cpu;
    
	// 기본 생성자(Default constructor)(인자로 아무것도 전달 받지 않는 생성자)
	public Computer() {
		System.out.println("기본 생성자가 호출되었습니다.");
	}
    
	// 생성자
	public Computer(Cpu cpu) {
		this.cpu=cpu;
	}
    
	// method
	public void doGame() {
		if(this.cpu==null) {
			System.out.println("Cpu 가 없어서 컴퓨터가 동작을 안해요");
			return; // method 끝내기
		}
		System.out.println("컴퓨터로 게임을 해요!");
	}
}
		// Computer 객체를 생성해서 참조값을 c1 이라는 이름의 지역변수에 담아 보세요.
		Computer c1=new Computer(new Cpu());
		//c1 에 들어 있는 참조값을 이용해서 .doGame() method를 호출해 보세요.
		c1.doGame();
		
		Computer c2=new Computer(null);
		c2.doGame();

 앞선 - 01, - 02와 - 03의 다른 점이 무엇일까? 생성자가 여러 개인 점이 다르다. 생성자는 얼마든지 용도에 따라, 필요에 따라 다중 정의가 가능하다. 이것의 의미는 즉, 객체를 생성하는 방법이 여러가지라는 의미이다. 이렇게 생성자를 여러 개 정의하는 것을 over loading(다중 정의) 되어있다고 말한다.

 또 다른 점은 기본 생성자가 작성되어있다는 것이다. 만약에 생성자를 하나라도 정의하게 되면, 기본 생성자는 사라지기 때문에 사용하고 싶다면 그때부터는 명시적으로 작성해주어야 사용할 수 있다.

 class의 method는 더 이상 실행할 것이 없거나, return을 만나면 종료된다.

 

- 04

public class MyMain01 {
	public static void main(String[] args) {
		/*
		 * Random한 number를 얻어내고 싶다면
		 * Random 객체를 활용해야 한다.
		 * 따라서 new Random() 해서 객체를 생성 후
		 * 객체의 method를 이용해서 Random number를 얻어내보자.
		 */
		Random ran = new Random();
		boolean bool = ran.nextBoolean();
		System.out.println(bool);
		
		// int 범위 안에서 랜덤한 정수 얻어내기
		int num1 = ran.nextInt();
		// 0~4에서 random number
		// int bound (0~ bound 사이 => 0<= x <bound)
		int num2 = ran.nextInt(5);
		// 10~20 사이의 random number
		int num3 = ran.nextInt(11)+10;
		// 75~100
		int num4 = ran.nextInt(26)+75;
		// -15~15
		int num5 = ran.nextInt(31)-15;
		
		System.out.println("num1: " +num1);
		System.out.println("num2: " +num2);
	}
}

 Random( ) 객체의 사용법이다.

 

		/*
		 *  프로그래밍의 목적 : 무작위 정수를 얻어내고 싶다
		 *  얻어내서 무얼하지? 그냥 console 창에 출력하고 싶다.
		 */
         
		// Random 객체를 생성해서 참조값을 지역변수에 담기
		Random ran=new Random();
		// method를 호출하고 return되는 값을 지역 변수에 담기
		int a=ran.nextInt();
		// console 창에 출력해보기
		System.out.println(a);
		
		/*
		 *  또 해결해야 하는 문제 : 원하는 범위 내에서 정수값을 얻어내고 싶다
		 *  범위는 ? 1~45 
		 *  얻어내서 무얼하나? console 창에 출력한다.
		 */
		
		// Random 객체는 이미 생성되어서 ran 이라는 지역변수에 담겨 있다. 
		// 다시 생성하지 않고 재 사용하기로~
		int lottoNum=ran.nextInt(45)+1;
		System.out.println(lottoNum);

 프로그래밍을 통해 목적을 달성하기 위해서 이미 만들어져있는 class를 사용해 객체의 도움을 받아야만 한다. 예시에서는 무작위 정수를 얻어내는 객체, console 창에 메시지를 출력하는 객체의 도움을 받아야 한다. 때문에 java를 객체 지향 언어라고 말하고, 이런 객체 지향 언어를 사용한 프로그래밍을 객체 지향 프로그래밍(OOP : Object-Oriented Programming)이라고 한다,.

 

 하지만 해당 객체의 도움을 받는 과정에서 사용할 수 있는 이 모든 method들을 전부 기억하는 것이 가능할까? 이론상으로는 가능하겠지만 실제로 모든 내용을 기억할 수는 없을 것이다. 하지만 이름으로 대충 추정하는 것은 가능하며, 마우스를 올렸을 때 보이는 설명을 통해서도 대략의 정보를 알 수 있다.

 

- 05

public class MyMain02 {
	public static void main(String[] args) {
		System.out.println("main method가 시작되었습니다.");
		/*
		 * console 창으로부터 사용자의 입력을 받아서 활용하고 싶다면?
		 * Scanner 객체를 생성해서 method를 이용해야 한다.
		 */
		// console 창으로부터 입력받을 수 있는 객체의 참조값을 is라는 local variable에 담기
		InputStream is = System.in;
		// local variable에 담긴 값을 생성자의 인자로 전달해서 scanner 객체 생성하기
		Scanner scan = new Scanner(is);
		
		// 위의 두 줄의 code를 한 줄로 작성하면
		Scanner scan2= new Scanner(System.in);
		
		System.out.print("문자열 입력 : ");
		
		String str = scan.nextLine();
		System.out.println("str : " + str);
	}
}

 Scanner( ) 객체의 사용법이다.

 

		/*
		 *  프로그래밍의 목적 : 키보드로 부터 문자열을 입력 받고 싶다.
		 *  입력 받아서 무얼하나? console 창에 출력한다.
		 */
		
		Scanner scan=new Scanner(System.in);
        
		// 키보드로 입력 받기 위해서는 일단 console 창을 열리게 해야한다.
		System.out.println("문자열을 입력하세요:");
        
		// Scanner  객체의 method를 이용해서 문자열(String) 입력 받기
		String str=scan.nextLine();
        
		// 입력받은 문자열을 console 창에 출력하기 
		System.out.println(str);
		
		System.out.println("main 메소드가 종료 됩니다.");

 프로그래밍으로 특정 목적을 달성하기 위해 객체의 도움을 받는 또다른 예시이다. 문자열을 입력받고, 출력하는 것이 목적인 경우이다. 이전에 console 창에 원하는 메시지를 출력하기 위해서 System class의 out을 사용하였다. console 창을 통해 입력하는 것은 in을 사용하면 된다. 그리고 Scanner 객체를 이용해서 해당 객체의 nextLine( ) method를 이용한다. nextLine( ) method를 사용하면 console 창에 입력할 때까지 기다려준다.

 

- 06

	public static void main(String[] args) {
		JFrame f=new JFrame("김구라");
        
		// 창의 위치와 폭과 높이 
		f.setBounds(100, 100, 500, 500);
        
		// 창이 화면상에 보이도록 한다. 
		f.setVisible(true);
        
		// 창을 닫았을때 프로세스도 자동으로 종료 되도록 한다. 
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}

  어떤 GUI 창을 만드는 예시이다. JFrame( ) 객체를 만들어서 사용하는데, 나중에 또 배울 예정이기도 하고 중요한 부분은 아니라고 했다. setBounds( ), setVisible( ), setDefaultCloseOperation( ) 같은 method가 있다는 정도만 보고 넘어간다고 했다.

 

- 07

 

	public static void main(String[] args) {
		// 기본 생성자를 호출해서 객체 생성하고 참조값을 지역 변수에 담기 
		Computer com1=new Computer();
        
		// Cpu type 을 전달받는 생성자를 호출해서 객체 생성하고 참조값을 지역 변수에 담기
		Computer com2=new Computer(new Cpu());
		
		com1.doGame(); // 게임 불가
		com2.doGame(); // 게임 가능 
	}
	// field
	public Cpu cpu;
    
	// 기본 생성자(인자로 아무것도 전달 받지 않는 생성자)
	public Computer() {
		System.out.println("기본 생성자가 호출되었습니다.");
	}
    
	// 생성자
	public Computer(Cpu cpu) {
		this.cpu=cpu;
	}

 Computer( ) 객체를 만들기 위한 class에는 바로 위와 같은 field와 constructor가 있었다. 첫 번째 Computer( ) 객체는 기본 생성자를 호출하여 cpu에 아무런 값이 들어가지 않기 때문에 게임이 불가능한 상태인 것이고, 두 번째 객체는 Cpu 객체를 생성자의 인자로 주어서 cpu값이 null이 아니기에 게임이 가능한 상태가 된다.

'뒷북 정리 (국비 교육) > java' 카테고리의 다른 글

[Java] step08. Array  (0) 2022.04.17
[Java] step07. Wrapper Class  (0) 2022.04.17
[Java] step05. Method  (0) 2022.04.13
[Java] step04. Class  (0) 2022.04.13
[Java] step03. Operator  (0) 2022.04.11

댓글