상속 ( Inheritance )

상속 ( Inheritance )

 

 

package inheritance;

import java.util.ArrayList;

class TestClass03 extends ArrayList<String>{
	// ArrayList 를 상속받은 TestClass03
	
	// 부모 클래스의 get 메소드를 오버라이딩
	@Override
	public String get(int index) {
		System.out.println("데이터를 가져오는 기능");
		return super.get(index);
	}
	
	// 부모 클래스의 add 메소드를 오버라이딩
	@Override
	public boolean add(String e) {
		System.out.println("데이터를 추가했습니다.");
		return super.add(e);
	} 
	
}

public class MainClass03 {
	public static void main(String[] args) {
		TestClass03 tc = new TestClass03();
		tc.add("aaa");
		// 데이터를 추가했습니다.
		
		System.out.println(tc.get(0));
		// 데이터를 가져오는 기능
		// aaa
	}
}

상속과 오버라이딩

상속 - extends 를 사용

오버라이딩 - Alt + Shift + S 후 Override/Implement Methods... 클릭

Override / Implement Methods....

 

상속을 사용한 경우와 사용하지 않은 경우의 코드 차이점 ( 상속을 사용한 경우가 더 간결한 코드로 작성이 가능하다 )

 

상속을 사용하는 이유

- 이미 만들어져 있는 클래스를 재사용하기 때문에 효율적이고 중복된 코드가 줄어든다

- 유지보수가 쉽다

- 확장성이 용이하다

- 재사용이 가능하다

- 코드가 간결해진다

 

 

 

 

 

super

package inheritance;

class Test06 {
	public void test() {
		System.out.println("부모 test 메소드");
	}
}

class TestClass06 extends Test06 {
	public void test() {
		System.out.println("자식 test 메소드");
	}
	public void display() {
		// test 메소드를 실행했을때 자기 자신에게 test 메소드가 없고
		// 부모 클래스에 test 메소드가 있다면 부모의 test 메소드를 실행한다
		
		test(); // 자식 test 메소드 출력
		this.test(); // 자식 test 메소드 출력
		super.test(); // 부모 test 메소드 출력
		
		// super : 부모 클래스를 의미
		// this  : 자기 자신 클래스를 의미
	}
}

public class MainClass06 {
	public static void main(String[] args) {
		TestClass06 tc = new TestClass06();
		tc.display();
	}
}

super 와 this

 

package inheritance;

class Test07{
	public Test07() {
		System.out.println("부모 생성자 실행");
	}
}

class TestClass07 extends Test07{
	public TestClass07() {
		System.out.println("자식 생성자 실행");
	}
}

public class MainClass07 {
	public static void main(String[] args) {
		TestClass07 tc = new TestClass07();
		// 부모 생성자 실행
		// 자식 생성자 실행
		
		// 자식을 객체화 했을때 상속받은 부모의 생성자부터 실행되며
		// 부모의 생성자가 실행된 이후 자식의 생성자가 실행된다
	}
}

상속 받을 경우 생성자의 실행 순서 ( 부모 -> 자식 )

 

package inheritance;

class Test08{
	public Test08(String s) {
		System.out.println(s + "부모 생성자 실행!!!");
	}
}

class TestClass08 extends Test08{
	public TestClass08() {
		// 부모 클래스의 생성자가 문자열을 필요로하기 때문에
		// super(); 안에 문자열을 적어 부모 클래스 생성자를
		// 호출할때 해당 값을 전달한다
		// 이때, 사용하는 super(); 는 무조건 생성자의 맨 첫 줄에
		// 적어야 한다!!!!
		super("값 전달\n");
		System.out.println("자식 생성자 실행!!!");
	}
}

public class MainClass08 {
	public static void main(String[] args) {
		TestClass08 tc = new TestClass08();
		// 값 전달
		// 부모 생성자 실행!!!
		// 자식 생성자 실행!!!
	}
}

부모 클래스의 생성자가 매개변수를 필요로 하는 경우

 

package inheritance;

class Test09{
	public Test09() {
		System.out.println("부모 기본 생성자");
	}
	public Test09(String s) {
		System.out.println(s + " : 부모 생성자");
	}
}

class TestClass09 extends Test09{
	public TestClass09() {
		System.out.println("자식 기본생성자");
	}
	public TestClass09(String s) {
		super(s);
		System.out.println(s + " : 자식 생성자");
	}
}

public class MainClass09 {
	public static void main(String[] args) {
		TestClass09 tc = new TestClass09("전달");
		// 자식 클래스로 이동 > 부모 클래스로 이동
		// super(); 를 통해 부모 클래스로 값을 전달했기 때문에
		// ( 만약 super 를 사용하지 않았다면 부모의 기본 생성자가 실행된다 )
		// 부모 클래스의 매개변수를 필요로 하는 생성자 실행 >
		// 자식 클래스의 매개변수를 필요로 하는 생성자 실행
		
		TestClass09 tc2 = new TestClass09();
		// 자식 클래스로 이동 > 부모 클래스로 이동
		// 부모 클래스의 기본 생성자 실행 > 자식 클래스의 기본 생성자 실행
		// ( 매개변수가 없기 때문에 둘 다 기본 생성자가 실행되었음 )
	}
}

부모 클래스의 매개변수를 전달하는 방법 : super();

 

 

 

 

 

private, protected

package inheritance;

class Test10{
	// 상속을 받든지 말든지 자기 자신을 제외한 모든 접근을 차단
//	private int num = 1000;
	
	// 상속받은 자식 클래스는 접근을 허용
	protected int num = 1000;
}

class TestClass10 extends Test10{
	public int num = 12345;
	public void test() {
		System.out.println("num : " + num);
		
		// 자기 자신의 변수 num 을 출력 후 없다면 부모 클래스의 num 탐색
		System.out.println("this.num : " + this.num);
		
		// 부모 클래스의 변수 num 을 탐색 -> 만약 num 변수가 없다면 컴파일 오류 발생
		System.out.println("super.num : " + super.num);
	}
}

public class MainClass10 {
	public static void main(String[] args) {
		TestClass10 tc = new TestClass10();
		tc.test();
	}
}

private 과 protected 의 차이점

 

 

 

 

 

다중 상속

package inheritance;

class A{
	public void a() {
		System.out.println("a 메소드 실행");
	}
}
class B extends A{
	// A 를 상속
	public void b() {
		System.out.println("bbbb 메소드 실행");
	}
}
class C extends B{
	// A 를 상속한 B 를 상속
	public void c() {
		System.out.println("cccccccc 메소드 실행");
	}
}

public class MainClass11 {
	public static void main(String[] args) {
		// A 를 상속한 B 를 상속한 C 를 객체로 생성
		C c = new C();
		
		// 다중 상속을 통해 A, B, C 의 모든 메소드를 사용할 수 있다
		c.a();
		c.b();
		c.c();
	}
}

중복으로 상속하는 것은 class 에서는 불가능하기 때문에 여러번에 거쳐서 상속을 진행

 

 

 

 

 

 

 

 

 

 

실습 예제

실습 예제

이전에 만들었던 로그인 프로그램을 찾지 못하는 연유로 처음부터 코딩.....

 

package inheritance;

public class MainLogIn {
	public static void main(String[] args) {
		
		LogInService ls = new LogInService();
		while(true) {
			ls.mainPrint();
		}
	}
}

MainLogIn 클래스

 

package inheritance;

import java.text.SimpleDateFormat;
import java.util.Scanner;

public class LogInService extends java.util.Date {
	Scanner sc = new Scanner(System.in);
	LogInDTO DTO = new LogInDTO();
	
	// 메인 메뉴
	public void mainPrint() {
		System.out.println("1. 로그인");
		System.out.println("2. 회원가입");
		System.out.println("3. 탈퇴");
		System.out.print(">>> : ");
		int choice = sc.nextInt();
		
		switch(choice) {
		case 1 : logIn(); break;
		case 2 : createId(); break;
		case 3 : removeId(); useTime(); break;
		default :
			System.out.println("입력 오류!!!");
			break;
		}
	}
	
	// 로그인
	private void logIn() {
		if(DTO.getId() == null) {
			System.out.println("회원 등록부터 진행하세요!");
		}
		else {
			System.out.print("아이디를 입력 : ");
			String id = sc.next();
			System.out.print("비밀번호를 입력 : ");
			String pwd = sc.next();
			
			checkId(id, pwd);
		}
	}
	
	// 로그인 시 아이디 검증
	private void checkId(String id, String pwd) {
		if(DTO.getId().equals(id) && DTO.getPwd().equals(pwd)) {
			System.out.println("!!! " + id + "님 로그인 완료 !!!");
			// 로그인 완료 시 시간 저장
			DTO.setStartTime(System.currentTimeMillis());
		}
		else System.out.println("회원정보가 올바르지 않습니다");
	}
	
	// 회원 생성
	private void createId() {
		if(DTO.getId() == null) {
			System.out.print("아이디 입력 : ");
			String id = sc.next();
			System.out.print("비밀번호 입력 : ");
			String pwd = sc.next();
			
			DTO.setId(id);
			DTO.setPwd(pwd);
			System.out.println("회원가입이 완료되었습니다!");
		}else {
			System.out.println("이미 회원이 존재합니다. 삭제 후 진행하세요");
		}
	}
	
	// 회원 삭제
	private void removeId() {
		DTO.setId(null);
		DTO.setPwd(null);
		System.out.println("회원 탈퇴가 완료되었습니다!!!");
		
		// 회원 삭제 시간 저장
		DTO.setEndTime(System.currentTimeMillis());
	}
	
	// 로그인 시간, 탈퇴 시간, 사용 시간 출력
	private void useTime() {
		SimpleDateFormat si = new SimpleDateFormat("yyyy년 MM월 dd일 aa hh시 mm분 ss초");
		System.out.println("시작 시간 : " + si.format(DTO.getStartTime()));
		System.out.println("종료 시간 : " + si.format(DTO.getEndTime()));
		System.out.println("사용 시간 : " + ((DTO.getEndTime()-DTO.getStartTime()) / 1000) + "초");
	}
}

LogInService 클래스

( java.util.Date 클래스를 상속받아 사용 날짜에 대한 정보를 저장 및 출력 )

 

package inheritance;

public class LogInDTO {
	private long startTime, endTime;
	private String id, pwd;
	
	// getter / setter
	public long getStartTime() {
		return startTime;
	}
	public void setStartTime(long startTime) {
		this.startTime = startTime;
	}
	public long getEndTime() {
		return endTime;
	}
	public void setEndTime(long endTime) {
		this.endTime = endTime;
	}
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getPwd() {
		return pwd;
	}
	public void setPwd(String pwd) {
		this.pwd = pwd;
	}
}

LogInDTO 클래스

 

 

 

 

 

 

코드 실행
728x90

 

 

숫자 야구

 

 

package com.baseball;

public class Main {
	public static void main(String[] args) {
		while(true) {
			BaseballService bb = new BaseballService();
			int choice = bb.mainPrint();
			bb.choiceNum(choice);
		}
	}
}

Main 클래스

 

package com.baseball;

import java.io.IOException;
import java.util.Random;
import java.util.Scanner;

public class BaseballService {
	Scanner sc = new Scanner(System.in);
	BaseballDTO DTO = new BaseballDTO();
	Random ran = new Random();
	
	public int mainPrint() {
		System.out.println("★★★★★ 숫자 야구 ★★★★★★");
		System.out.println("★   1. 숫자 야구 플레이   ★");
		System.out.println("★   2. 종         료     ★");
		System.out.println("★★★★★★★★★★★★★★★★★★");
		System.out.print("번호 입력 >>> ");
		int choice = sc.nextInt();
		return choice;
	}
	
	public void choiceNum(int choice) { 
		switch(choice) {
		case 1 : mainGame(); break;
		case 2 : 
			System.out.println("프로그램을 종료합니다");
			break;
		default :
			System.out.println("입력 오류 발생!!! 프로그램을 다시 실행하시오");
			break;
		}
	}
	
	public void mainGame() {
		// 콘솔창 지우기
		erasePrint();
		// 숫자 야구 정답 생성 - DTO 클래스의 mainBall 에 저장
		makeMainBall();
		// 숫자 생성부분 시각화
		makeView();
		
		while(true) {
			System.out.println("★★★★★★★★★★★");
			System.out.println("★수를 예상하세요★");
			System.out.println("★    ex)0125   ★");
			System.out.println("★★★★★★★★★★★");
			System.out.println("현재 도전 횟수 : " + DTO.getTryNum());
			System.out.print("입력 >>> ");
			String guessBall = sc.next();
			try{
				if(Integer.parseInt(guessBall) > 0 && Integer.parseInt(guessBall) < 10000) {
					// 추측한 숫자를 guessBall 변수로 생성자를 통해 세팅
					DTO.setGuessBall(guessBall.charAt(0), guessBall.charAt(1), guessBall.charAt(2), guessBall.charAt(3));
					checkBall();
					System.out.println("--- 추측 결과 ---");
					System.out.println("   Strike : " + DTO.getStrike());
					System.out.println("   Ball   : " + DTO.getBall());
					System.out.println("----------------");
					
					System.out.println("다시 게임을 준비하는중.............");
					
					timeSleep(5000);
					
					// 정답을 맞춘 경우
					if(DTO.getStrike() == 4) {
						System.out.println("☆★☆★숫자를 모두 맞추셨습니다★☆★☆");
						System.out.println("☆★ 총 도전 횟수 : " + DTO.getTryNum() + " ★☆");
						System.out.printf("정 답 : %d %d %d %d\n",DTO.getMainBall(0), DTO.getMainBall(1), DTO.getMainBall(2), DTO.getMainBall(3));
						break;
					}
					
					// 스트라이크와 볼 갯수 초기화
					DTO.setBall(0); DTO.setStrike(0);
					// 도전 횟수 증가
					DTO.setTryNum(DTO.getTryNum() + 1);
					
				}else {
					System.out.println("!!!입력 오류!!!");
					continue;
				}
			} catch(Exception e){
				System.out.println("!!!입력 오류!!!");
				continue;
				}
			
			
		}
		
	}
	
	// 콘솔 창 지우개
	public void erasePrint() {
		for(int i=0; i<=100; i++) System.out.println();
	}
	// 정답 생성
	public void makeMainBall() {
		int[] num = new int[4];
		for(int i=0; i<4; i++) {
			num[i] = ran.nextInt(10);
			for(int j=0; j<i; j++) {
				if(num[i] == num[j]) i--;
			}
		}
		DTO.setMainBall(num[0], num[1], num[2], num[3]);
	}
	// a 초 만큼 코드 중지
	public void timeSleep(int a) {
		try {
			Thread.sleep(a);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
	// 난수 생성 시각화
	public void makeView() {
		for(int i=1; i<=4; i++) {
			System.out.println("★★★★★★★★★★★★★★★★★★");
			System.out.printf("★★★★%d번째 수 생성중★★★★\n", i);
			timeSleep(1000);
			for(int j=0; j<=7; j++)
				System.out.println("★★★★★★★★★★★★★★★★★★");
				timeSleep(500);
		}
		System.out.println("★★★★★★준비  완료★★★★★★");
		System.out.println();
	}
	// Strike 와 Ball 갯수 체크
	public void checkBall() {
		for(int i=0; i<4; i++) {
			if (DTO.getGuessBall(i) == DTO.getMainBall(i)) {
				DTO.setStrike(DTO.getStrike() + 1);
			}
			for(int j=0; j<4; j++) {
				if(DTO.getGuessBall(i) == DTO.getMainBall(j)) {
					DTO.setBall(DTO.getBall() + 1);
				}
			}
		}
	}
}

BaseballService 클래스

 

package com.baseball;

import java.util.ArrayList;

public class BaseballDTO {
	// 숫자 야구 정답
	private int[] mainBall = new int[4];
	// 추측 숫자
	private int[] guessBall = new int[4];
	// 정답이면 true, 정답이 아니면 false
	private boolean ballCheck = false;
	// 도전 횟수, ball, strike
	private int tryNum = 0, ball = 0, strike = 0;
	
	public BaseballDTO() {}
	
	public int getMainBall(int i) {
		return mainBall[i];
	}
	public void setMainBall(int num1, int num2, int num3, int num4) {
		this.mainBall[0] = num1;
		this.mainBall[1] = num2;
		this.mainBall[2] = num3;
		this.mainBall[3] = num4;
	}
	public boolean isBallCheck() {
		return ballCheck;
	}
	public void setBallCheck(boolean ballCheck) {
		this.ballCheck = ballCheck;
	}
	public int getTryNum() {
		return tryNum;
	}
	public void setTryNum(int tryNum) {
		this.tryNum = tryNum;
	}
	public int getGuessBall(int i) {
		return guessBall[i];
	}
	public void setGuessBall(char num1, char num2, char num3, char num4) {
		this.guessBall[0] = Character.getNumericValue(num1);
		this.guessBall[1] = Character.getNumericValue(num2);
		this.guessBall[2] = Character.getNumericValue(num3);
		this.guessBall[3] = Character.getNumericValue(num4);
	}
	public int getBall() {
		return ball;
	}
	public void setBall(int ball) {
		this.ball = ball;
	}
	public int getStrike() {
		return strike;
	}
	public void setStrike(int strike) {
		this.strike = strike;
	}	
}

BaseballDTO 클래스

 

 

 

 

- 메모 -

1. 코드를 더 깔끔하게 정리하여 작성할 수 있는 방법이 무엇인지 생각하기

2. 현재 작성한 코드에 중복된 코드가 무엇인지, 추후에 공부하면서 보완할 내용은 무엇인지 꾸준하게 생각하기

3. web 또는 Unity 를 활용하여 게임을 실제 시각화하여 서비스해보기

728x90

 

 

 

 

 

실습

미니 실습

 

package constructor;

public class MainClass {
	public static void main(String[] args) {
		TimeService ts = new TimeService();
		ts.display();
	}
}

MainClass 클래스

 

package constructor;

import java.text.SimpleDateFormat;
import java.util.Scanner;

public class TimeService {
	Scanner sc = new Scanner(System.in);
	TimeDTO DTO = new TimeDTO();
	SimpleDateFormat si = new SimpleDateFormat("yyyy년 MM월 dd일 aa hh시 mm분 ss초");
	String startTime, endTime;
	int useTime;
	
	// 기본 메뉴 출력
	public void display() {
		while(true) {
			System.out.println("1. 시작 시간 설정");
			System.out.println("2. 시작 시간 확인(년 월 일 시 분 초)");
			System.out.println("3. 종료 시간 설정");
			System.out.println("4. 종료 시간 확인(년 월 일 시 분 초)");
			System.out.println("5. 사용 시간 가져오기");
			System.out.print("선택 >>> ");
			int choice = sc.nextInt();
			
			switch(choice) {
			case 1: startTime(); break;
			case 2: showStart(); break;
			case 3: endTime(); break;
			case 4: showEnd(); break;
			case 5: useTime(); break;
			default : System.out.println("입력 오류!!!\n"); break;
			}
		}
	}
	// 시작 시간 설정
	private void startTime() {
		DTO.setStartTime(System.currentTimeMillis());
		System.out.println("시작 시간 설정 완료");
	}
	// 시작 시간 출력
	private void showStart() {
		startTime = si.format(DTO.getStartTime());
		System.out.println("시작 시간 : " + startTime);
	}
	// 종료 시간 설정
	private void endTime() {
		DTO.setEndTime(System.currentTimeMillis());
		System.out.println("종료 시간 설정 완료");
	}
	// 종료 시간 출력
	private void showEnd() {
		endTime = si.format(DTO.getEndTime());
		System.out.println("종료 시간 : " + endTime);
	}
	// 사용 시간 출력
	private void useTime() {
		// 시작시간이 종료시간보다 빠른 경우
		if ( DTO.getEndTime() < DTO.getStartTime() ) {
			System.out.println("시작 시간이 종료시간보다 빠를 수 없습니다.");
		}
		// 시작 시간이 설정되지 않은 경우
		else if ( DTO.getStartTime() == 0 ) {
			System.out.println("시작 시간을 설정해주세요");
		}
		// 종료 시간이 설정되지 않은 경우
		else if ( DTO.getEndTime() == 0 ) {
			System.out.println("종료 시간을 설정해주세요");
		}
		// 사용 시간 계산 후 출력
		else {
			double use = DTO.getEndTime() - DTO.getStartTime();
			useTime = (int)(use / 1000);
			System.out.println("사용 시간 : " + useTime + "초");
		}
	}
}

TimeService 클래스

 

package constructor;

public class TimeDTO {
	private long startTime, endTime;
	
	public long getStartTime() {
		return startTime;
	}
	public void setStartTime(long startTime) {
		this.startTime = startTime;
	}
	public long getEndTime() {
		return endTime;
	}
	public void setEndTime(long endTime) {
		this.endTime = endTime;
	}
}

TimeDTO 클래스

 

 

코드 실행
728x90

 

 

 

 

 

실습

미니 실습

 

package constructor;

public class MemberMain {
	public static void main(String[] args) {
		MemberService mem = new MemberService();
		mem.display();
	}
}

MemberMain 클래스

 

package constructor;

import java.util.Scanner;

public class MemberService {
	Scanner sc = new Scanner(System.in);
	MemberDTO DTO = new MemberDTO();
	
	// 메인 메뉴 출력
	public void display() {
		
		while(true) {
			System.out.println("=== 학생관리 프로그램 ===");
			System.out.println("     1. 학생 등록");
			System.out.println("     2. 학생 보기");
			System.out.println("     3. 정보 수정");
			System.out.println("     4. 회원 탈퇴");
			System.out.println("========================");
			System.out.print("번호를 선택하세요 >>> ");
			
			int choice = sc.nextInt();
			
			switch(choice) {
			case 1 : createStd(); break;
			case 2 : showStd(); break;
			case 3 : changeStd(); break;
			case 4 : removeStd(); break;
			default : 
				System.out.println("!!!입력 오류!!!");
				break;
			}
		}
	}
	
	// 학생 정보 입력
	private void createStd() {
		System.out.print("이름 입력 >>> ");
		String name = sc.next();
		System.out.print("국어 성적 입력 : ");
		int kor = sc.nextInt();
		System.out.print("영어 성적 입력 : ");
		int eng = sc.nextInt();
		System.out.print("수학 성적 입력 : ");
		int math = sc.nextInt();
		
		DTO = new MemberDTO(name, kor, eng, math);
		int sum = getSum(kor, eng, math);
		char grade = getGrade(getSum(kor, eng, math));
		DTO.setSum(sum);
		DTO.setGrade(grade);
	}
	
	// 합 구하기
	private int getSum(int kor, int eng, int math) {
		return (kor + eng + math);
	}
	
	// 평균 구하기
	private char getGrade(int sum) {
		double aver = sum/3.0;
		if (aver >= 90) return 'A';
		else if (aver >= 80) return 'B';
		else return 'c';
	}
	
	// 학생 정보 출력
	private void showStd() {
		
		if ( DTO.getName() != null) {
			System.out.println("========= 학생 정보 =========");
			System.out.println("이름 : " + DTO.getName());
			System.out.println("국어 : " + DTO.getKor());
			System.out.println("영어 : " + DTO.getEng());
			System.out.println("수학 : " + DTO.getMath());
			System.out.println("합 : " + DTO.getSum());
			System.out.println("등급 : " + DTO.getGrade());
			System.out.println("============================");
			System.out.println();
		}
		else System.out.println("학생 정보를 등록 후 이용하세요.\n");
	}
	
	// 점수 변경
	private void changeStd() {
		if (DTO.getName() != null) {
			System.out.println("\n===== 정보 수정 =====");
			System.out.println("1. 이름 수정");
			System.out.println("2. 국어 점수 수정");
			System.out.println("3. 영어 점수 수정");
			System.out.println("4. 수학 점수 수정");
			System.out.println("====================");
			System.out.print("선택하세요 >>> ");
			int choice = sc.nextInt();
			
			switch(choice) {
			case 1 : changeName(); break;
			case 2 : changeKor(); break;
			case 3 : changeEng(); break;
			case 4 : changeMath(); break;
			case 5 : 
				System.out.println("!!! 입력 오류 !!!\n");
				break;
			}
			
			System.out.println("!!! 변경 완료 !!!\n");
			DTO.setSum(DTO.getKor() + DTO.getEng() + DTO.getMath());
			DTO.setGrade(getGrade(DTO.getSum()));
		}else System.out.println("학생 정보를 등록 후 이용하세요.\n");
	}
	
	// 이름 변경
	private void changeName() {
		System.out.print("변경할 이름 입력 : ");
		String name = sc.next();
		DTO.setName(name);
	}
	
	// 국어 변경
	private void changeKor() {
		System.out.print("국어 점수 입력 : ");
		int kor = sc.nextInt();
		DTO.setKor(kor);
	}
	
	// 영어 변경
	private void changeEng() {
		System.out.print("영어 점수 입력 : ");
		int eng = sc.nextInt();
		DTO.setMath(eng);
	}
	
	// 수학 변경
	private void changeMath() {
		System.out.print("수학 점수 입력 : ");
		int math = sc.nextInt();
		DTO.setMath(math);
	}
	
	// 학생 탈퇴
	private void removeStd() {
		if(DTO.getName()!=null) {
			DTO = new MemberDTO();
			System.out.println("!!!회원정보 초기화 완료!!!\n");
		} else System.out.println("등록된 회원이 없습니다.\n");
	}
}

MemberService 클래스

 

package constructor;

public class MemberDTO {
	private String name;
	private int kor, eng, math, sum;
	private char grade;
	public String getName() {
		return name;
	}
	
	public MemberDTO(String name, int kor, int eng, int math){
		this.name = name;
		this.kor = kor;
		this.eng = eng;
		this.math = math;
	}
	
	public MemberDTO() {}
	
	// getter / setter 생성
	public void setName(String name) {
		this.name = name;
	}
	public int getKor() {
		return kor;
	}
	public void setKor(int kor) {
		this.kor = kor;
	}
	public int getEng() {
		return eng;
	}
	public void setEng(int eng) {
		this.eng = eng;
	}
	public int getMath() {
		return math;
	}
	public void setMath(int math) {
		this.math = math;
	}
	public int getSum() {
		return sum;
	}
	public void setSum(int sum) {
		this.sum = sum;
	}
	public char getGrade() {
		return grade;
	}
	public void setGrade(char grade) {
		this.grade = grade;
	}
}

MemberDTO 클래스

 

 

 

 

코드 실행
728x90

 

 

 

 

 

Default 접근 제한자

패키지를 분리

 

 

private 과 public 의 접근제한자가 붙지 않은 클래스나 메소드의 경우 같은 패키지 내에서는 접근이 가능하나 같은 프로젝트 안이라도 패키지가 분리되어 있다면 접근이 불가하다

접근제한자가 붙지 않은 것을 default 라고 부른다

728x90

 

 

 

 

 

TimeClass

package etc;

import java.text.SimpleDateFormat;
import java.util.Date;

public class TimeClass01 {
	public static void main(String[] args) {
		
		long time = System.currentTimeMillis();
		System.out.println( time ); // 1708317469108
		
		// 시간을 가져온 값을 사람이 확인할 수 있게 포맷팅 해야함
		// SimpleDataFormat 클래스를 선언하여 형식을 지정
		SimpleDateFormat si = new SimpleDateFormat("yyyy년 MM월 dd일 aa hh시 mm분 ss초");
		// 객체화할때 포맷할 시간을 넣어주면 String 형태로 시간이 반환된다
		String s = si.format(time);
		System.out.println(s);
		// 2024년 02월 19일 오후 01시 40분 33초

		
		
		// Date 라는 클래스로도 시간을 불러올 수 있다
		Date date = new Date();
		System.out.println(date); // Mon Feb 19 13:40:33 KST 2024
		System.out.println(si.format(date)); // 동일하게 포맷팅을 사용할 수 있다
		// 2024년 02월 19일 오후 01시 40분 33초
		
	}
}

시간을 불러와서 사용할 수 있는 클래스

 

 

 

 

 

Tread.sleep()

package etc;

import java.util.Date;

public class SleepClass01 {
	public static void main(String[] args) {
		
		for( int i=0; i<5; i++ ) {
			System.out.println(i + " : " + new Date());
			
			try {
				Thread.sleep( 2000 ); // 2 초를 기다렸다가 다음 코드를 진행
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		
		System.out.println("시작");
		long start = System.currentTimeMillis();
		try {
			Thread.sleep(3000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		
		long end = System.currentTimeMillis();
		System.out.println("종료");
		System.out.println("사용 시간 : " + (end - start) / 1000);
	}
}

코드 진행 시 딜레이를 주는 클래스

728x90

 

 

 

 

 

DTO ( Data Transfer Object )

- DTO 는 생성자 또는 getter / setter 를 통해 각 프로세스 간에 데이터를 전달하는 객체를 의미한다.

- 다른 메소드는 가지지 않으며 오로지 데이터 전달용도로만 사용되는 객체이다

데이터를 생성하여 전달하는 역할을 하는 DTO 객체

 

 

 

 

 

 

 

 

 

 

실습 예제

 

 

예제 풀이

package constructor;

public class MainClass03 {
	public static void main(String[] args) {
		LoginService03 login = new LoginService03();
		login.display();
	}
}

MainClass03 클래스

package constructor;

import java.util.Scanner;

public class LoginService03 {
	// 전역에서 DTO 를 사용해야하기 때문에 선언해둔 뒤 각 메소드에서
	// DTO 를 객체화하여 전역에서 사용
	private LoginDTO03 d;
	private Scanner sc = new Scanner(System.in);
	
	public void display() {
		
		d = new LoginDTO03();
		
		while(true) {
			System.out.println("1. 로그인");
			System.out.println("2. 회원가입");
			System.out.println("3. 탈퇴");
			System.out.print(">>> ");
			int choice = sc.nextInt();
			
			switch(choice) {
				case 1 : logIn(); break;
				case 2 : createId(); break;
				case 3 : deleteId(); break;
				default : System.out.println("다시 선택하세요."); break;
			}
			
		}
	}
	
	public void logIn() {
		String id, pwd;
		if(d.getId()==null)
			System.out.println("회원가입 먼저 하세요!!!");
		else {
			System.out.print("아이디 입력 : ");
			id = sc.next();
			System.out.print("비밀번호 입력 : ");
			pwd = sc.next();
			idCheck(id, pwd);
		}
	}
	
	public void idCheck(String id, String pwd) {
		if(!id.equals(d.getId()) && pwd.equals(d.getPwd()) == true)
			System.out.println("존재하지 않는 id입니다.");
		else if(id.equals(d.getId()) && !pwd.equals(d.getPwd()))
			System.out.println("비밀번호가 틀렸습니다!!!");
		else if(id.equals(d.getId()) && pwd.equals(d.getPwd()))
			System.out.println(id + "님 로그인 되었습니다!!!");
	}
	
	public void createId() {
		String id, pwd;
		if(d.getId()!=null) 
			System.out.println("사용자가 존재합니다. 탈퇴 후 진행하세요!!!");
		else {
			sc = new Scanner(System.in);
			System.out.print("생성할 아이디를 입력하세요 : ");
			id = sc.next();
			if(d.getId() == null) {
				System.out.print("비밀번호를 입력하세요 : ");
				pwd = sc.next();
				d = new LoginDTO03(id, pwd);
				System.out.println(id + "님 회원가입 성공!!!");
			}
		}
	}
		
	
	public void deleteId() {
		if(d.getId() == null)
			System.out.println("회원가입 먼저 진행하세요!!!");
		else {
			d = new LoginDTO03();
			System.out.println("회원 탈퇴 완료!!");
		}
	}
}

LoginService03 클래스

package constructor;

public class LoginDTO03 {
	// 멤버변수 선언
	private String id, pwd;
	// 생성자 선언 및 멤버변수 초기화
	public LoginDTO03(String id, String pwd) {
		this.id = id;
		this.pwd = pwd;
	}
	
	// 기본 생성자 선언
	public LoginDTO03() {}
	
	// getter / setter 생성
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getPwd() {
		return pwd;
	}
	public void setPwd(String pwd) {
		this.pwd = pwd;
	}
}

LoginDTO03 클래스

 

( 문자열은 .equals() 메소드로 비교해야 하는데,,,, 비교연산자(==) 로 비교하는 실수를 했음,,,, 다음엔 꼭 기억하기 )

728x90

 

 

 

 

 

생성자 ( Constructor )

생성자

 

package constructor;

class TestClass01{
	public TestClass01() {
		// 생성자는 객체를 만들때 자동으로 호출
		System.out.println("생성자 실행");
	}
	public void test() {
		System.out.println("test 호출");
	}
}

public class Ex01 {
	public static void main(String[] args) {
		// 객체 생성, 생성자가 호출되어 자동으로 실행된다
		// "생성자 실행" 문구 출력
		TestClass01 t = new TestClass01();
	}
}

생성자는 객체가 생성될때 자동으로 호출된다

 

package constructor;

class TestClass02{
	private String officeName;
	// 생성자
	public TestClass02(String officeName) {
		System.out.println("생성자 실행");
		this.officeName = officeName;
		// 생성자에서 초기화
	}
	// setter
	public void setOfficeName(String officeName) {
		this.officeName = officeName;
	}
	// getter
	public String getOfficeName() {
		return this.officeName;
	}
}

public class Ex02 {
	public static void main(String[] args) {
		String name = "나의 회사";
		TestClass02 t = new TestClass02(name);
		// 객체를 만들때 생성자가 자동으로 호출,,,,,
		// officeName 이 생성자의 코드에서 초기화 됨 - 생성자는 초기화하는 목적으로 사용
		// ( 즉, setter 를 사용할 필요가 없음 )
		
		// t.setOfficeName(name); // setter 호출
		System.out.println(t.getOfficeName()); // getter 호출
	}
}

생성자를 사용하는 이유

 

package constructor;

class TestClass03{
	private String name, addr;
	private int age;
	
	// 생성자 선언
	// setter 를 사용하지 않고 생성자를 통해 초기화
	public TestClass03(String name, String addr, int age) {
		this.name = name;
		this.addr = addr;
		this.age = age;
		System.out.println("생성자를 통한 초기화");
	}
	
	// getter / setter 생성
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getAddr() {
		return addr;
	}
	public void setAddr(String addr) {
		this.addr = addr;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
}

public class Ex03 {
	public static void main(String[] args) {
		TestClass03 t = null; // = new TestClass03();
		// System.out.println(t);
		// t.setAddr("aaa");
		String name = "홍길동";
		String addr = "산골짜기";
		int age = 20;
		t = new TestClass03(name, addr, age);
		// t.setName(name);
		// t.setAddr(addr);
		// t.setAge(age);
		System.out.println("이름 : " + t.getName());
		System.out.println("주소 : " + t.getAddr());
		System.out.println("나이 : " + t.getAge());
	}
}

setter 를 사용하면 멤버변수의 갯수가 많아지면 많아질수록 코드가 길어지는데, 이때 생성자를 사용하여 간단하게 초기화를 시킬 수 있다

 

 

 

 

 

생성자 오버로딩

package constructor;

class TestClass04{
	public TestClass04(int num) {
		System.out.println("매개변수 받는 생성자");
	}
	// 생성자를 선언하는 순간 기본 생성자는 자동으로 소멸되기 때문에
	// 생성자를 선언 후 기본 생성자가 필요하다면 따로 선언해줘야 한다
	public TestClass04() {
		System.out.println("기본 생성자 실행");
	}
	
	// 메소드 오버로딩
	public void test() {
		System.out.println("test 호출");
	}
	public void test(int num) {
		System.out.println(num + " test 호출");
	}
}

public class Ex04 {
	public static void main(String[] args) {
		TestClass04 t = null;
		t = new TestClass04(20); // 매개변수 받는 생성자
		t = new TestClass04(); // 기본 생성자 실행
		
		// 오버로딩된 메소드 호출
		// t.test(); // test 호출
		// t.test(20); // 20 test 호출
		
	}
}

생성자를 선언하면 기본 생성자는 소멸하기 때문에 무조건 기본 생성자는 선언해주는 것이 오류 예방에 좋다

728x90

+ Recent posts