Java

JAVA 자바 웹 개발 Day7 (Code1 )

jnk1m 2022. 2. 16. 00:42

70.

package day07;

public class Test70 {
	
	static void add() {}
	static void add(int x) { //위와 오버로딩 됨
		System.out.println(x);
	}
	//static void add(int a) {} //위와 오버로딩 안됨
	
	static void add(long a) {}
	static void add(long a, int b) {}
	static void add(int a, long b) {}//전부 오버로딩 가능 
	
	
	public static void main(String[] args) {
		add();
		add(100);
		add(100L,100); //앞에가 롱타입이므로 꼭 L을 붙여줘야 롱으로 인식함. 안그러면 int로. 
		

	}

}

클래스 변수 생성자 오버 로딩

 

 

71.

package day07;

public class Test71 {
	//클래스
	static int x = 10;
	//클래스 블록: 프로그램 실행 시 자동으로 한번 실행됨. 재호출 절대 불가능
	static {
		System.out.println("클래스 초기화 블럭");
		x =200;
	}

	//인스턴스 변수
	int y =20;
	//인스턴스 블록: 객체 생성시 자동으로 한번 실행됨. 재호출 절대 불가능 
	{
		System.out.println("인스턴스 초기화 블럭");
		x=300;
		y=500;
	}
	
	public static void main(String[] args) {
		Test71 test = new Test71();
		
		System.out.println(test.x);
		System.out.println(test.y);
		
		
}

}

클래스 블록 & 인스턴스 블록 초기화. 먼저 test.x 를 호출하면 x에 정수 200이 담기나 바로 다음 test.y -> y의 초기화 블록에 있는 x=300; y=500 대입문으로 인해 최종 값은 x =300 y=500 값이 출력된다. 

 

72.

package day07;

public class Test72 {
//클래스 초기화 블록
	static int [] arr = new int [10];
	static {
		for(int i =0; i < arr.length;i++) {
			arr[i] = (int)(Math.random()*10)+1;
		}
	}
	public static void main(String[] args) {
		System.out.println("메인 시작");
		for(int i =0; i < arr.length;i++) {
			System.out.println(arr[i]);
		}
	}

}

 

 

클래스 초기화 블록

 

73.

package day07;

class Product{
	//인스턴스 초기화 블럭
	static int count = 0; //인스턴스 개수를 저장할(카운트할) 변수
	String serialNo; //제품 고유 번호 저장할 변수
	{
		++count;
		serialNo = "P00"+count;
	}
}

public class Test73 {
	public static void main(String[] args) {
		Product p1 =new Product();
		Product p2 =new Product();
		Product p3 =new Product();
		
		System.out.println("p1 제품의 번호는: " + p1.serialNo);
		System.out.println("p2 제품의 번호는: " + p2.serialNo);
		System.out.println("p3 제품의 번호는: " + p3.serialNo);
		System.out.println("생상된 전체 제품 개수: " + Product.count);

	}

}

인스턴스 초기화 블록

 

74.

package day07;

public class Test74 {
	
	double d;
	
	Test74(){
		System.out.println("생성자 호출");
		d = Math.random();
	}
	//생성자 오버로딩 
	Test74(double a){
		d =a;	
	}

	public static void main(String[] args) {
		//Test74 test = new Test74(); //기본 생성자
		//System.out.println(test.d);
		Test74 test2 = new Test74(3.14); 
		System.out.println(test2.d);
		
	}

}

생성자 오버 로딩. 

객체를 생성할 때 클래스 이름 뒤에 인자를 넣으면 해당 생성자를 찾아 자동으로 초기화를 해준다. 

 

75.

package day07;

class Book{
	String title;  //제목
	String author; //작가 
	
	//매개변수가 있는 생성자가 작성되면, 인수를 안주고는 객체 생성이 안됨. 
	Book(String title){ //책 제목을 외부로부터 입력받아 책 생산 되도록 생성자 만듬. 
		this.title =title; //지역 변수가 우선순위가 되서 지역변수 title에 대입이 됨. 그래서 this를 넣어준다
		author = "작자미상";
	}
	
	Book(String title, String author){
		this.title =title; //this. 라는건 객체 자기자신을 가리킨다. 내 객체 안에 있는 타이틀
		this.author = author; //지역변수 말고, new에서 만든 객체 안에 있는 author 
	}
	
}
public class Test75 {

	public static void main(String[] args) {

		Book kong = new Book("콩쥐팥쥐");
		System.out.println(kong.title + " " + kong.author);

		Book littlePrince = new Book("어린왕자", "생텍쥐페리");
		System.out.println(littlePrince.title + " " + littlePrince.author);

	}

}

두 개의 생성자를 만듦. 하나는 매개변수가 하나, 다른 하나는 매개변수가 두 개.

매개변수를 하나만 받는 생성자의 경우엔 author에 "작자미상"을 넣는다.

매개변수를 두 개 받는 생성자의 경우엔 인자를 받아서 각 변수에 값을 넣어준다. 

메인에서 객체를 생성하며 인자를 전달해보자.. 하나만 넣은 경우엔 책 제목 작자미상으로 출력, 두 개 넣으면 제목과 작가가 모두 출력된다. 

 

76.

package day07;

class Circle{
	int radius; //반지름
	
	//자동으로 기본생성자 생성되는 형태
	//Circle(){} 눈에 안보이는 생성자 생성, 실행하며 객체 생성됨.
	
	void set(int r) { //반지름 값을 세팅해주는 메서드
		radius = r;
	}
	
	double getArea() { //원의 너비를 구해주는 메서드 
		return radius * radius * 3.14;
	}
}

public class Test76 {

	public static void main(String[] args) {
		
		Circle pizza = new Circle();
		pizza.set(15);
		System.out.println(pizza.getArea());

	}

}

자동으로 기본 생성자가 생성된다. 77번과 비교하여 분석해보자

 

77.

package day07;

//기본생성자가 자동으로 만들어지지 않는 형태
class Circle1{
	int radius; 
	/*생성자: 개발자가 의도를 가지고 생성자에 매개변수를 작성 해놨기 때문에
	외부에서 데이터를 던져주고 객체 생성을 해야 객체가 온전히 돌아가는구나,라고 생각.  
	개발자의 의도를 존중하여, 기본 생성자를 자동 생성해주지 않는다. 
	new 클래스() 이런식으로 매개 변수 없이 불완전할 수 있는 객체 생성은 도와주지 않는다. 
	*/
	Circle1(int r){
		radius = r;
	}
	//매개변수 없는 생성자로도 객체 생성을 하고 싶으면 개발자가 명시적으로 매개변수 없는
	//생성자를 직접 작성해줘야 한다. 
	Circle1(){
	}
	//메서드
	void set(int r) {
		radius = r;
	}
	
	double getArea() { 
		return radius * radius * 3.14;
	}
}

public class Test77 {

	public static void main(String[] args) {
		Circle1 c = new Circle1(5);
		Circle1 c1 = new Circle1();
		System.out.println(c.getArea());
	}

}

위에서 매개변수가 있는 생성자를 생성하였기 때문에 자동으로 기본 생성자가 생기지 않는다. 

이런 경우에 매개 변수 없는 기본 생성자를 쓰고 싶으면 직접 작성해야 한다.