수업

+18 생성자, 초기화 블럭 (static, instance)

hs_developer 2022. 5. 26. 16:40

p291

 

this & super

class B
{
	int a=30;
}

class A extends B
{
	int a=20;
	
	void display()
	{
		int a=10;
		System.out.println(a); // 10
		System.out.println(this.a); // 20
		System.out.println(super.a); // 30
	}
}

 

자리 배치 = new
전원 연결 = Computer(){} = 생성자
전원 누른다 = 메소드

 

 

 

기본 생성자

기본 생성자가 컴파일러의 의해 추가되는 경우는 클래스에 정의된 생성자가 하나도 없을 때이다.

모든 클래스는 생성자 1개 이상 가지고 있어야 한다.

 

특징
1. 매개 변수가 없는 생성자
2. 생성자가 없는 경우 → 컴파일러가 기본 생성자 자동 생성
3. 멤버 변수의 초기화를 담당한다.
4. 시작과 동시에 동작하게 한다.
클래스명(){}

 

 

name: 김나나
kor: 80
eng: 90
math: 90
// 대상이 1명일 때 :: 이런 경우가 잘 없기에 잘 안 쓴다

class Student
{
	// 명시적 초기화 :: 시작과 동시에 출력 불가능
	String name = "김나나";
	int kor=80, eng=90, math=90;
	
	// 생성자
	Student() 
	{
		System.out.println("name: " + name);
		System.out.println("kor: " + kor);
		System.out.println("eng: " + eng);
		System.out.println("math: " + math);
	}

}

public class 생성자 {
	
	public static void main(String[] args) {
		
		// 시작과 동시에 동작하게 한다
		Student s = new Student();
	}
	
}

 

 

 

매개변수 생성자

 

이름: 김가가
성별: 남자
주소: 서울
전화: 010-1111-1111
나이: 20
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
이름: 김나나
성별: 여자
주소: 인천
전화: 010-2222-2222
나이: 23
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
이름: 김다다
성별: 남자
주소: 부산
전화: 010-3333-3333
나이: 25
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
class Member
{
	String name; 
	String sex;
	String address;
	String tel;
	int age;
	
	// 생성자 :: 초기화만 담당
	Member(String n, String s, String ad, String t, int a)
	{
		name = n;
		sex = s;
		address = ad;
		tel = t;
		age = a;
	}
	
	void print()
	{
		// 초기값 출력 :: 초기화 확인
		System.out.println("이름: " + name);
		System.out.println("성별: " + sex);
		System.out.println("주소: " + address);
		System.out.println("전화: " + tel);
		System.out.println("나이: " + age);
		System.out.println("ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ");
	}
	
	
	// static 사용시 별도의 메소드이기 때문에 반드시 메모리 할당 후 사용 :: 사용 드뭄
	static void print2()
	{
		Member m1 = new Member("김가가", "남자", "서울", "010-1111-1111", 20);
		System.out.println("이름: " + m1.name);
		System.out.println("성별: " + m1.sex);
		System.out.println("주소: " + m1.address);
		System.out.println("전화: " + m1.tel);
		System.out.println("나이: " + m1.age);
		System.out.println("ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ");
	}
	
}

public class 생성자 {
	
	public static void main(String[] args) {
		
		Member m1 = new Member("김가가", "남자", "서울", "010-1111-1111", 20);
		Member m2 = new Member("김나나", "여자", "인천", "010-2222-2222", 23);
		Member m3 = new Member("김다다", "남자", "부산", "010-3333-3333", 25);
		
		m1.print();
		m2.print();
		m3.print();
	
	}
	
}

 

 

다른 생성자 호출

 

생성자가 여러 개일시 다른 생성자 호출 :: this(), this(값, 값)
첫 번째 줄에서만 사용 가능

 

이름: 김나나
나이: 25
이름: 김가가
나이: 20
이름: 김다다
나이: 0
이름: 김라라
나이: 27
class Sawon
{
	String name;
	int age;
	
	// 1
	Sawon()
	{
		name = "김나나";
		age = 25;
	}
	
	// 2
	Sawon(int age)
	{
		this("김가가"); // 자신의 클래스에서 클래스 호출, 첫 줄에만 작성 가능
		this.age = age; // this :: 클래스 자신
	}
	
	// 3
	Sawon(String name)
	{
		this.name = name;
	}
	
	// 4
	Sawon(int age, String name)
	{
		this.age = age;
		this.name = name;
	}
	
	void print()
	{
		System.out.println("이름: " + name);
		System.out.println("나이: " + age);
	}
}

public class 다른생성자호출 {

	public static void main(String[] args) {
		
		// 1 일반 생성자
		Sawon s = new Sawon();
		s.print();
		
		// 2 :: age 
		Sawon s1 = new Sawon(20);
		s1.print();
		
		// 3 :: name
		Sawon s2 = new Sawon("김다다");
		s2.print();
		
		// 4 :: age, name
		Sawon s3 = new Sawon(27, "김라라");
		s3.print();
		
		
	}
}

 

 

 

초기화 블럭

 

1.

ID: hong
이름: 김다다
class Sawon1
{
	String name = "김가가";
	
	static String id = "admin";
	static
	{
		id = "hong";
	}

	// 초기화 블럭
	{
		name = "김나나"; 
	}
	
	// 생성자
	Sawon1()
	{
		name = "김다다";
	}
}
public class 초기화블럭 {
	
	public static void main(String[] args) {
		
		System.out.println("ID: " + Sawon1.id);
		
		Sawon1 s = new Sawon1();
		System.out.println("이름: " + s.name);
	}
	
}

 

 

2. 난수 5개 발생 후에 최대 값 초기화 사용하기

 

명령문이 있기 때문에 명시적 초기화 X
1. 생성자 2. 초기화 블럭 중에 선택 :: 인스턴스
instance :: 생성자가 호출 되어야 저장 됨
static :: 생성자를 호출하지 않아도 저장 됨
편한 방법
Static :: static 블럭 사용
Instance :: 생성자 사용

 

Instance1:max = 83
Instance2:max = 93
Static1:max = 97
Static2:max = 98
class Instance1
{
	// 초기화 블럭
	int max;
	
	{
		int m = 0;
		for(int i=0; i<5; i++)
		{
			int rand = (int)(Math.random()*100)+1;
			
			if(rand > m)
				m = rand;
		}
		max = m;
	}
}

class Instance2
{
	int max;
	
	Instance2()
	{
		int m = 0;
		for(int i=0; i<5; i++)
		{
			int rand = (int)(Math.random()*100)+1;
			
			if(rand > m)
				m = rand;
		}
		max = m;
	}
}

class Static1
{
	static int max;
	
	static
	{
		int m = 0;
		for(int i=0; i<5; i++)
		{
			int rand = (int)(Math.random()*100)+1;
			
			if(rand > m)
				m = rand;
		}
		max = m;
	}
}

class Static2
{
	static int max;
	
	static
	{
		int m = 0;
		for(int i=0; i<5; i++)
		{
			int rand = (int)(Math.random()*100)+1;
			
			if(rand > m)
				m = rand;
		}
		max = m;
	}
}

public class 초기화블럭2 {
	
	public static void main(String[] args) {
		
		Instance1 in1 = new Instance1();
		System.out.println("Instance1:max = " + in1.max);
		
		Instance2 in2 = new Instance2();
		System.out.println("Instance2:max = " + in2.max);
		
		
		Static1 s1 = new Static1(); // 메모리 할당
		System.out.println("Static1:max = " + s1.max);
		
		System.out.println("Static2:max = " + Static2.max); // 자동 저장
	}
}

 

 

3. static, instance 변수, 메소드 사용 범위

 

class Member
{
	String name; // 인스턴스 내에서만 사용 가능
	static String address; // 전역변수
	// 대부분 인스턴스 변수, 인스턴스 메소드 위주로 사용 됨
	// 인스턴스 초기화 :: 생성자
	
	{
		// instance 블럭 :: 인스턴스 변수를 초기화하는 영역
		name = "aaa";
		address = "aaa";
	
	}
	
	static
	{
		address = "bbb"; // 가능 :: static
		name = ""; // 불가능 :: 인스턴스 → 메모리 할당 후 가능
	}
	
	// 생성자는 static이 없다
	Member()
	{
		// static, instance 둘 다 가능 :: 인스턴스
		name = "bbb";
		address = "ccc";
	}
	
	void print() // 인스턴스
	{
		name = "ddd";
		address = "ddd";
		display(); // 가능 :: static
	}
	
	static void display()
	{
		address = "eee";
		name = "kkk"; // 불가능 :: 인스턴스
		print(); // 불가능 :: 인스턴스
	}
}

public class 초기화블럭3 {

	public static void main(String[] args) {
		
	}
}

 

 

id, name 필드를 외부에서 받은 값으로 초기화 하려고 할 때 생성자 선언 방법은?

Class Member
{
    String id, name, pwd
    int age;
    
    Member(String id, String name) // 외부, 사용자 입력 :: 초기화
    {
        this.id = id;
        this.name = name;
    }
}

Scanner sc = new Scanner(System.in);

String name = sc.next();
String id = sc.next();

Member m = new Member(id, name);

 

 

'수업' 카테고리의 다른 글

+20 캡슐화, 패키지  (0) 2022.05.30
+19 리뷰 프로그램(등록, 보기, 수정, 삭제)  (0) 2022.05.27
+17 멤버 메소드  (1) 2022.05.25
+16 멤버 변수(static, instance)  (0) 2022.05.24
+15 객체 지향, 클래스 데이터형 제작  (1) 2022.05.23