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
'프로그래밍 > 수업일지' 카테고리의 다른 글
수업일지 12일차 (23/10/05) - Java (1) | 2023.10.05 |
---|---|
수업일지 11일차 (23/10/04) - Java (0) | 2023.10.04 |
수업일지 9일차 (23/09/26) - Java (0) | 2023.09.26 |
수업일지 8일차 (23/09/25) - Java (0) | 2023.09.25 |
수업일지 7일차 (23/09/22) - Java (1) | 2023.09.22 |