728x90

 

수업내용 정리 (Java)

 

1. class 복습+a

 1-1) 생성자

  • 기본 생성자는 만들지 않아도 자동 컴파일된다.
  • 리턴 타입이 없다.
  • 그러나 생성자를 따로 만들면 기본 생성자는 자동 컴파일 되지 않아서 기본 생성자로 만든 객체가 있다면 오류가 난다.

 

 1-2) 오버로딩

public Fruit() {	// 기본 생성자
}
public Fruit(String name) {	//두번째 생성자
	this.name = name;
}
public Fruit(String name, String color) {
	this(name);	//두번째 생성자 실행 <= 다른 생성자를 호출할 때는 맨 위에 위치해야함
	this.color = color;
}
public Fruit(String name, String color, boolean isSeed) {
	this(name, color);	//세번째 생성자 실행
	this.isSeed = isSeed;
}
  • 생성자의 이름은 class명과 동일해서 생성자를 여러번 쓸 수 없을 것 같지만 오버로딩으로 여러번 사용이 가능하다.
  • 오버로딩을 사용하려면 매개변수의 개수나 타입 다르게 적어줘야 한다.
  • 매개변수의 이름이 달라도 타입이 같은데 위치도 같다면 사용할 수 없다.
  • 생성자 내에서 다른 생성자를 호출해서 사용할 수 있다. (ex: this.(name) 등)

 

 1-3) 생성자 or 메서드

// 생성자
public Student(String no, String name, String dept, int year) {
	this.no = no;
	this.name = name;
	this.dept = dept;
	this.year = year;
}
// 메서드
public void setNo(String no) {
	this.no = no;
}
public void setName(String name) {
	this.name = name;
}
public void setDept(String dept) {
	this.dept = dept;
}
public void setYear(int year) {
	this.year = year;
}

 

  • 두 코드 모두 필드에 값을 저장하기 위한 코드다.
  • 보기에는 생성자에 적는 것이 가장 간편하지만, 그렇다고 이 방법이 가장 좋은 방법이라는 것은 아니다.

 

2. class 예제

 2-1) Member

// 필드(인스턴스변수, 멤버변수)
private int id;
private String email;
private String pw;
private String name;
private String joinDate;
  • joinDate: 가입 날짜를 담기 위해 만든 필드

 

// 생성자
public Member() {
	DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");
	String now = dtf.format(LocalDateTime.now());
	this.joinDate = now;
}
public Member(int id, String email, String pw, String name) {
	this();
	this.id = id;
	this.email = email;
	this.pw = pw;
	this.name = name;
}
  • 기본 생성자: 가입 날짜를 여러번 적지 않기 위해 가입 날짜를 적어주는 코드를 담았다.
  • 생성자: 객체를 생성할 때, 한 번에 바로 값을 대입하기 위해서 매개변수를 사용했다. this();를 통해 위의 기본 생성자를 호출하여 사용했다.

 

// 메서드
public void setId(int id) {
	this.id = id;
}
public void setEmail(String email) {
	this.email = email;
}
public void setPw(String pw) {
	this.pw = pw;
}
public void setName(String name) {
	this.name = name;
}
  • 위의 생성자와 동일하게 객체를 생성하고 값을 입력받아 저장할 수 있도록 해주는 메서드
  • 매개변수에 필드에서 선언한 이름과 동일한 변수명을 이용하려면 실행문에서 적을 필드명에 this.를 붙여주어야 컴퓨터가 구분할 수 있다.

 

public int getId() {
	return id;
}
public String getEmail() {
	return email;
}
public String getPw() {
	return pw;
}
public String getName() {
	return name;
}
  • 리턴 값이 있는 메서드는 필드 값이 private 일때 출력하는 메서드라고 생각하면 편하다.

 

public void print() {
	System.out.printf("%d\t%s\t%s\t%s\t%s\n", id,name,email,pw,joinDate);
}

 

 

 2-2) MemberMain

Scanner sc = new Scanner(System.in);
Member[] list = new Member[10];
int cnt = 0;
int id = 1000;

while (true) {
	System.out.println("=====멤버관리시스템=====");
	System.out.println("1.멤버등록 2.멤버목록 3.검색 4.멤버수정 0.종료");
	System.out.print("메뉴 선택> ");
	int menu = -1;
	if(sc.hasNextInt()) {
		menu = sc.nextInt();
	}else {
		sc.next();
		System.out.println("숫자만 입력하세요.");
	}
	
	if (menu == 1) {
		// 두번째 생성자 사용하여 객체 생성
		System.out.print("이름 입력> ");
		String name = sc.next();
		System.out.print("이메일 입력> ");
		String email = sc.next();
		System.out.print("비밀번호 입력> ");
		String pw = sc.next();
		
		Member m = new Member(id++, email, pw, name);
		list[cnt] = m;
		cnt++;
		System.out.println(name + "님 환영합니다.");
		
	} else if (menu == 2) {
		System.out.printf("아이디\t이름\t이메일\t비밀번호\t가입일자\n");
		System.out.println("==================================");
		for (Member mb : list) {
			if (mb != null) {
				mb.print();
				}
			}

	} else if (menu == 3) {
	// 아이디로 검색하고 멤버정보 출력
		System.out.print("검색할 아이디> ");
		int serchId = 0;
		if(sc.hasNextInt()) { 
			serchId = sc.nextInt();
			boolean find = false;
			for (Member mb : list) {
				if (mb != null) {
					if (mb.getId() == serchId) {
						System.out.printf("아이디\t이름\t이메일\t비밀번호\t가입일자\n");
						mb.print();
						find = true;
						break;
					}
				}
			}
			if (!find) {
				System.out.println("아이디를 찾을 수 없습니다.");
			}
		}else {
			sc.next();
			System.out.println("숫자만 입력하세요.");
		}
		
	} else if (menu == 4) {
		// 이메일과 비밀번호를 입력받고, 맞으면 비밀번호 수정
		System.out.print("아이디 입력> ");
		String serchEm = sc.next();
		System.out.print("비밀번호 입력> ");
		String serchPw = sc.next();
		boolean find = false;
		for (Member mb : list) {
			if (mb != null) {
				if (mb.getEmail().equals(serchEm) && mb.getPw().equals(serchPw)) {
					System.out.print("비밀번호 수정> ");
					String rPw = sc.next();
					mb.setPw(rPw);
					System.out.println("비밀번호가 성공적으로 수정되었습니다.");
					find = true;
					break;
				}
			}
		}
		if (!find) {
			System.out.println("아이디를 찾을 수 없습니다.");
		}
	} else if (menu == 0) {
		break;
	}
	System.out.println();
}
  • 문제) 메뉴 1, 2, 3, 4번 만들기
  • hasNextInt는 예외처리를 할 때 사용하는 Scanner 클래스의 메서드다. 메뉴 선택이나 아이디 입력 등 int만 입력받아야 하는 경우에 사용한다.

 


 

질문한 내용이나 어려웠던 점 메모

  • 내가 생각한 방법은 이것밖에 없는데 밑줄이 쳐져서 왜 안 되나..싶었다. 근데 지웠다가 똑같이 적었는데 밑줄없이 오류없이 잘 출력되길래 당황스러웠다.
  • foreach 문법이 너무 어렵다..안 보고 응용할만큼 익숙해지려면 시간이 꽤 걸릴 것 같다.

 


 

전체 피드백

  • 밑줄이 쳐져있다고 해서 무조건 오류가 아니라 저장하면 밑줄이 사라지기도 하니 저장부터 하는 습관을 들여야겠다.
  • 코드 위치에 따라 출력이 달라지거나 기능이 달라지니 코드 위치 확인 필수!!!
  • boolean find는 여러번 문제를 풀면서 익숙해진 것 같다.

 


728x90