관리 메뉴

거니의 velog

230719 자바 강의 본문

대덕인재개발원_Java

230719 자바 강의

Unlimited00 2023. 7. 19. 17:26

객체가 생성될 때 반드시 호출되어야 할 생성자.
멤버 필드를 초기화하기 위함.
C#, C++는 생성자와 소멸자(틸드) 다 있다.
 
생성자는 초기화하는데, 실행되면 힙 메모리에 공간을 배정받고 맨 처음 데이터를 집어 넣는다.
 
생성자까지 실행되면 객체 주소가 하나 생성된다.
소멸자는 이 만들어진 주소는 구성하는 프로그램에서 사용하는 공간. 다른 프로그램에서는 참조 불가. 내가 점유하므로.
소멸자는 내가 프로그램 사용이 끝나면 다른 프로그램이 그 공간을 사용하게 하기 위해 주기억 장치의 메모리 공간을 운영체제에게 사용권한을 반납.
 
자바는 이 소멸자가 없느냐? 아니다.
운영체제에서 운영하는 기억장소 프로세스 중 하나가 가비지 콜렉터. 여기저기 흩어진 자투리 영역을 회수해서 운영체제에 반납.
쓰고 더 이상 사용되지 않는 메모리를 운영체제에 반납하는 역할.
 
자바에서 운영하는 것이 아닌 OS 운영체제에서 제공하는 기능.
자바는 이를 이용하는 것.
 
오브젝트 클래스 중 finalize 메서드.
시스템에서 호출. 가비지 콜렉터가 강제로 사용되어지지 않는 공간을 전부다 반납.
 
자바는 생성자만 있고 소멸자는 없으며 가비지 콜렉터를 이용한다.
 
생성자는 모든 클래스에 반드시 하나 이상 존재해야 한다.
생성자가 없는 클래스는 있을 수 없다.
 
나는 이제껏 생성자 없어도 자바 클래스 만들었는데?
사용자가 생성자 메서드를 하나도 만들지 않으면, 자바 컴파일러가 기본 생성자 메소드를 자동으로 생성해서 넣어줌.
기본 생성자를 사전식으로 정의하면, 매개변수를 갖지 않는 생성자. 코드가 있던 없던 상관 없음.
 
항상 기본 생성자를 넣지 않는다. 사용자가 생성자 메서드를 하나라도 만들면 컴파일러는 자동으로 기본 생성자를 넣지 않으므로 사용자가 기본 메서드를 따로 정의해야 한다.


생성자 오버로드 : 생성자는 하나의 클래스에 하나 이상 존재할 수 있다.

Overload 가 되기 위한 전제조건 ?

(1) 하나의 동일 클래스에 존재.

(2) 이름이 같은 메서드가 하나 이상 존재.

 
이 조건을 만족한다고 전부 오버로드 되진 않음.

상세 전제 조건?

(1) 매개변수의 개수가 달라야 함.

(2) 매개변수의 타입이 달라야 함.

(3) 매개변수의 배열 상태가 달라야 함.

이 중 적어도 하나를 만족해야 함.

 
그렇지 않으면 중복정의로 컴파일 오류가 뜬다.
 
사용목적?
이름이 같은 메소드로 다양한 데이터를 취급하기 위함.
덧셈을 하는 메소드가 있다면 두 개의 데이터 타입이 있어야 함.
int-int, int-double, int-float 등등
그 메서드의 매개 변수 타입이 다르면 원칙적으로는 다른 메서드.
데이터 타입의 컴비네이션 조합. 그 만큼의 메서드 이름을 만들어야 함. 이것도 일임.
그래서 나온 개념이 오버로드.
메소드 오버로드를 거의 매일 수없이 사용(System.out.println();).
System.out에 가보면 매개변수가 타입별로 다 다름. 우리는 그 중 하나를 사용.
 
[접근지정자] [클래스명] ([매개변수list : 변수선언문]-optional){
변수선언문 : 타입명 변수명(int num...). 보통 멤버필드 이름과 동일.
}
다른 클래스에서 생성자 메서드를 90% 이상 사용.
그럴려면 적어도 접근지정자가 default 이상 되어야 한다. private 금지.
 
싱글톤 패턴 : 클래스 객체를 만드는데 new 연산자가 사용되어지는 횟수 만큼 힙 메모리에 기억 공간이 배정되는데, 싱글톤 패턴은 힙 메모리를 하나만 점유한다. 트랜잭션의 데드락을 방지하기 위해 하나의 트랜잭션은 하나의 일만 처리하도록 조절. 이 때 private 접근지정자가 붙음. 내부에서만 사용 가능.
디자인 패턴 중 하나.
 
익스트림 프로그래밍 기법. 실리콘밸리 저서. 세미나 참석 자료.


this : 자기 자신의 클래스 참조 주소값.
this() : 생성자 메서드에서 사용.
맨 첫 줄에 사용. 안 써도 됨.
다른 생성자 메서드를 호출하는 역할을 함.
매개 변수 개수, 타입, 배열 상태가 같은 생성자 메서드를 부름.
(1) 생성자가 하나 이상 존재해야 함.
- 사용목적 ? 멤버필드 초기화 동작을 하나의 메서드에서만 수행하는 효과.

public class korean() {
	String nation;
	String name;
	String ssn;
	Korean() { this(“대한민국”, “홍길동”, “1234”); }
	Korean(String nation) {
		this(nation, “홍길동”, “1234”);		
        => Korean k1 = new Korean(“대한민국“); 으로 호출 가능.
		=> this(“대한민국“, “홍길동”, “1234”);		
        => Korean(String nation, String name, String ssn)을 호출하여 멤버변수에 초기화함.
	}
	Korean(String nation, String name) {
		
	}
	Korean(String nation, String name, String ssn) {
		this.nation = nation;
		this.name = name;
		this,ssn = ssn;
	}
}

데이터 중복을 없애고 데이터 전달에만 집중시키는 메소드.


[Account.java]

package ddit.chap06.sec04;

// 소유자 이름, 계좌번호, 잔고의 속성이 있고
// 입금(deposit), 출금(withdraw), 잔고확인(getBalance) 메서드. 외부인이 알게 해서는 안 됨.
public class Account {
	
	// 멤버 필드
	private String owner;
	private String accountNo;
	private int balance;
	
	public Account() {
		this("홍길동", "1234-12-1234", 1000);
	}
	
	public Account(String owner, String accountNo) {
		this(owner, accountNo, 5000);
	}
	
	public Account(String owner, String accountNo, int balance) {
		this.owner = owner;
		this.accountNo = accountNo;
		this.balance = balance;
	}
	
	public void deposit(int money) {
		balance += money;
		System.out.println("[입금] : " + money);
		getBalance();
	}
	
	public int withdraw(int money) {
		if(balance >= money) {
			balance -= money;
			System.out.println("[출금] : " + money);
			getBalance();
			return money;
		}else {
			System.out.println("[잔액이 부족합니다.]");
			getBalance();
			return 0;
		}
	}
	
	public void getBalance() {
		System.out.println("----------------------");
		System.out.println("고객명 : " + owner + "\n잔고 : " + balance);
		System.out.println("----------------------\n");
	}

}

[AccountExample.java]

package ddit.chap06.sec04;

public class AccountExample {

	public static void main(String[] args) {
		
		Account acc1 = new Account(); // 기본 생성자
		acc1.getBalance(); // this("홍길동", "1234-12-1234", 1000)에 의해 초기화.
		
		acc1.deposit(50000);
		acc1.withdraw(30000);
		acc1.withdraw(30000);
		
		Account acc2 = new Account("홍상순", "4567-45-4567");
		acc2.getBalance(); // this(owner, accountNo, 5000)에 의해 초기화
		
		acc2.deposit(50000);
		acc2.withdraw(30000);
		acc2.withdraw(30000);
		
	}

}

콘솔 결과


[개념 모델링] - 50% 진척도

엔터티 구별
속성을 가려냄
관계 설정
요구사항 가운데 명사를 가려냄. 고유명사 제거.
 

[논리 모델링]

엔터티를 Relation 으로 바꿈.
속성은 Attribute
관계 : n:m => 1:n 이나 n:1로 분할되어야 한다.
정규화 : 보통 3정규형까지 쓴다.
컬럼이 이 테이블에 오는 것이 맞느냐?
데이터 중복으로 인해 이상 현상 발생. 제일 큰 문제가 삭제 이상.
 

[물리 모델링]

하드에 저장될 형태 마련
수직분할, 수평통합이 이루어져야 한다.
DB도 튜닝이 있다. 처음에는 잘 돌아가다가 데이터가 쌓이면 문제 발생. 이 때 하는 것이 튜닝. 고급 기술자. 거의 새로 데이터베이스를 만드는 것 만큼 소요.


[Employees.java]

package ddit.chap06.sec04;

// 사원 클래스
// 사원번호(empID), 사원명(empName), 부서명(deptName), 급여(salary)
// 5명의 사원정보를 생성하여 저장하고
// 전체조회, 개별조회를 수행하는 메서드 생성
public class Employees {
	
	private String empID;
	private String empName;
	private String deptName;
	private int salary;
	
	// 기본 생성자
	public Employees() {}
	
	// 사원번호, 사원명, 부서명만 입력받는 생성자(salary는 0으로 설정)
	public Employees(String empID, String empName, String deptName) {
		this(empID, empName, deptName, 0);
	}
	
	public Employees(String empID, String empName, String deptName, int salary) {
		this.empID = empID;
		this.empName = empName;
		this.deptName = deptName;
		this.salary = salary;
	}
	
	public String getEmpID() {
		return empID;
	}

	public void setEmpID(String empID) {
		this.empID = empID;
	}

	public String getEmpName() {
		return empName;
	}

	public void setEmpName(String empName) {
		this.empName = empName;
	}

	public String getDeptName() {
		return deptName;
	}

	public void setDeptName(String deptName) {
		this.deptName = deptName;
	}

	public int getSalary() {
		return salary;
	}

	// 급여를 설정하는 메서드
	public void setSalary(int salary) {
		this.salary = salary;
	}

	// 내용을 출력하는 메서드(toString())
	@Override
	public String toString() {
		String str = "사원번호 = " + empID + "\n";
		str += "사원명 = " + empName + "\n";
		str += "부서명 = " + deptName + "\n";
		str += "급여 = " + salary;
		return str;
	}

}

[EmployeesExample.java]

package ddit.chap06.sec04;

import java.util.Scanner;

public class EmployeesExample {

	Scanner sc = new Scanner(System.in);
	
	Employees[] employee = {new Employees("202310001", "정몽주", "공공개발팀"),
							new Employees("202111012", "김민우", "개발지원팀"),
							new Employees("202011031", "이순신", "개발지원팀"),
							new Employees("202210001", "박자바", "공공개발팀"),
							new Employees("202010001", "강자바", "공공개발팀")};
	
	public static void main(String[] args) {
		
		EmployeesExample emp = new EmployeesExample();
		
		while (true) {
			int choice = emp.mainView();
			switch (choice) {
			case 1:
				emp.selectList();
				break;
			case 2:
				emp.selectOne();
				break;
			case 3:
				int choi = emp.salaryView();
				emp.setSalaryFn(choi);
				break;
			case 9:
				System.out.println("프로그램을 종료합니다...");
				System.exit(0);
				break;
			default:
				System.out.println("------------------------------");
				System.out.println("작업번호를 잘못 선택하셨습니다...");
				System.out.println("------------------------------");
			}
		}
		
	}
	
	public int mainView() {
		System.out.println("[[사원조회]]");
		System.out.println(" 1. 전체 조회");
		System.out.println(" 2. 부서별 조회");
		System.out.println(" 3. 급여 설정");
		System.out.println(" 9. 종료");
		System.out.println("------------------------------");
		System.out.print("선택 >> ");
		int choice = Integer.parseInt(sc.nextLine());
		return choice;
	}
	
	public void selectList() {
		System.out.println("부서명            사원번호          이름     급여 ");
		System.out.println("------------------------------");
		for(int i=0; i<employee.length; i++) {
			System.out.printf("%-11s", employee[i].getDeptName());
			System.out.printf("%-11s", employee[i].getEmpID());
			System.out.printf("%-5s", employee[i].getEmpName());
			System.out.printf("%-5s\n", employee[i].getSalary());
		}
		System.out.println("------------------------------");
	}
	
	public void selectOne() {
		System.out.print("조회할 부서명 : ");
		String dept = sc.nextLine();
		System.out.println("부서명            사원번호          이름     급여 ");
		System.out.println("-------------------------------");
		for(int i=0; i<employee.length; i++) {
			if(dept.equals(employee[i].getDeptName())) {
				System.out.printf("%-11s", employee[i].getDeptName());
				System.out.printf("%-11s", employee[i].getEmpID());
				System.out.printf("%-5s", employee[i].getEmpName());
				System.out.printf("%-5s\n", employee[i].getSalary());
			}
		}
		System.out.println("------------------------------");
	}
	
	public int salaryView() {
		System.out.println("[[급여 설정]]");
		System.out.println(" 1. 전체 급여 설정");
		System.out.println(" 2. 사원별 급여 설정");
		System.out.println("------------------------------");
		System.out.print("선택 >> ");
		int choice = Integer.parseInt(sc.nextLine());
		return choice;
	}
	
	public void setSalaryFn(int choice) {
		switch (choice) {
		case 1 :
			System.out.print("급여 입력 : ");
			int money = Integer.parseInt(sc.nextLine());
			for(int i=0; i<employee.length; i++) {
				employee[i].setSalary(money);
			}
			break;
		case 2 : 
			System.out.print("사원번호 입력 : ");
			String empID = sc.nextLine();
			System.out.print("급여 입력 : ");
			money = Integer.parseInt(sc.nextLine());
			for(int i=0; i<employee.length; i++) {
				if(empID.equals(employee[i].getEmpID())) {
					employee[i].setSalary(money);
				}
			}
			break;
		default :
			System.out.println("------------------------------");
			System.out.println("급여설정을 잘못 선택하셨습니다...");
			System.out.println("------------------------------");
		}
	}

}

콘솔 결과

 

'대덕인재개발원_Java' 카테고리의 다른 글

230721 자바 강의  (0) 2023.07.21
230720 자바 강의  (0) 2023.07.20
230718 자바 강의  (0) 2023.07.18
230717 자바 강의  (0) 2023.07.17
230714 자바 강의  (0) 2023.07.14