분류 전체보기 (135)

728x90

class
혼자 해보고, 안 되면 앞서 배운 것들을 보면서 따라해보기

 

1. Day01_3

// 필드 (인스턴스변수, 멤버변수)
String name;
private String color;	// 현재 공간에서만 사용 가능
// 생성자
public Day01_3() {
	// 기본 생성자
	// 생성하지 않아도 자동 컴파일됨
}
public Day01_3(String name /*매개변수*/) {
	this.name = name;
    // 필드명과 매개변수명이 같을때 this. 사용 / 필드명 = 매개변수명
}
public Day01_3(String name,String color) {
	this.name = name;
	this.color = color;
}
// 메서드
public void setColor(String color) {
	this.color = color;
    // 현재 공간에서만 사용할 수 있는 private 필드에 값을 설정하기 위한 메서드
}
public String getColor() {
	return color;
    // 현재 공간에서만 사용할 수 있는 private 필드 값을 사용하기 위한 메서드
}

public void print() {
	System.out.printf("%s\t%s\n",name,color);
	// 미리 출력할 양식을 적어둔 메서드
}

 

2. Day01_3Main

Scanner sc = new Scanner(System.in);
	
Day01_3 first = new Day01_3("사과","빨강");
Day01_3[] nC = new Day01_3[10];
int cnt = 0;
while(true) {
	System.out.println("1.추가 2.목록 0.종료");
	System.out.print("메뉴 선택> ");
	int menu = sc.nextInt();
	System.out.println();
	if(menu == 1) {
		System.out.println("===추가=> ");
		Day01_3 s = new Day01_3();
		System.out.print("이름 설정> ");
		s.name = sc.next();
		System.out.print("색 설정> ");
		s.setColor(sc.next());
		nC[cnt] = s;
		cnt++;
	}else if(menu == 2){
		System.out.println("===목록=> ");
		for(int i=0; i<cnt; i++) {
			if(i == 0) {
				first.print();
			}
			nC[i].print();
		}
		
	}else if(menu == 0) {
		break;
	}else {
		System.out.println(" > 잘못된 메뉴 선택");
	}
	System.out.println();
}
System.out.println("종료");

 

출력 이미지 ㄱ

 


 

틀리거나 헷갈렸던 점 메모

  • 1번

 생성자를 만들때, void(리턴타입)를 적어서 메서드로 만들고는 2번에서 객체를 생성하려니 안 된다고 해서 이클립스의 도움을 받아 해결했다.

 생성자는 리턴타입이 없음!!

 

  • 2번

 객체를 생성하는 것부터 저장하는 것까지 기억나지 않아서 열심히 혼자 해보려고 했는데, nC[cnt].name 혹은 nC[cnt].setColor();까지는 접근했다. 물론 이 방법으로 했더니 오류가 나서 결국 배운 것을 보고 고쳤지만 근접했다고 생각한다..!

 객체 생성하는 법, 객체 배열에 저장하는 법 외우기!


 

전체 피드백

  • 생각보다 기억을 못하고 있어서 2번은 거의 보고 하듯이 한 것 같다. 여러번 보고 적어보면서 안 보고도 응용할 수 있도록 해야겠다.

 


728x90
728x90

if문이나 for문 등 선생님이 문제 주셨던 것들을 문제만 적어두고 풀어보는 것으로 복습을 진행했다.
10번은 메뉴만 적어두고 풀었다.

 

1. 입력받은 숫자가 짝수인지, 홀수인지, 0인지 출력

System.out.print("숫자 입력> ");
int m1 = sc.nextInt();
if(m1 == 0) {
	System.out.println(" > 0 입력");
}else if(m1%2 == 0) {
	System.out.println(" > 입력하신 숫자는 짝수입니다.");
}else {
	System.out.println(" > 입력하신 숫자는 홀수입니다.");
}

 

2. 입력받은 숫자에 따라 (3, 5, 3과5)의 배수, 둘다아님 출력

System.out.print("숫자 입력> ");
int m2 = sc.nextInt();
if(m2%15 == 0) {
	System.out.println(" > 입력하신 숫자는 3과 5의 배수입니다.");
}else if(m2%5 == 0) {
	System.out.println(" > 입력하신 숫자는 5의 배수입니다.");
}else if(m2%3 == 0){
	System.out.println(" > 입력하신 숫자는 3의 배수입니다.");
}else {
	System.out.println(" > 입력하신 숫자는 3과 5의 배수 어디에도 해당하지 않습니다.");
}

 

3. 숫자 두 개를 입력받고, 메뉴에 따라 +-*/% 값 출력

System.out.print("첫번째 숫자 입력> ");
int m31 = sc.nextInt();
System.out.print("두번째 숫자 입력> ");
int m32 = sc.nextInt();
System.out.println("1.더하기 2.빼기 3.곱하기 4.나누기 5.나머지");
for(int i=0; i<1; i++) {
	System.out.print("메뉴 선택> ");
	int m3 = sc.nextInt();
	if(m3 == 1) {
		System.out.println(" > "+m31+" + "+m32+" = "+(m31+m32));
	}else if(m3 == 2) {
		System.out.println(" > "+m31+" - "+m32+" = "+(m31-m32));
	}else if(m3 == 3) {
		System.out.println(" > "+m31+" + "+m32+" = "+(m31*m32));
	}else if(m3 == 4) {
		System.out.println(" > "+m31+" / "+m32+" = "+(m31/m32));
	}else if(m3 == 5) {
		System.out.println(" > "+m31+" % "+m32+" = "+(m31%m32));
	}else {
		System.out.println(" > 메뉴를 잘못 입력하셨습니다.");
		i--;
	}
}

 

4. 1~100의 합 출력

int m4 = 0;
for(int i=1; i<=100; i++) {
	m4+=i;
}
System.out.println(" > "+m4);

 

5. 1~300까지 (3, 5, 3과5)의 배수 개수 출력

int m53 = 0;
int m55 = 0;
int m515 = 0;
for(int i=1; i<=300; i++) {
	if(i%3 == 0) {
		m53++;
	}
	if(i%5 == 0) {
		m55++;
	}
	if(i%15 == 0) {
		m515++;
	}
}
System.out.println(" > 3의 배수의 개수: "+m53);
System.out.println(" > 5의 배수의 개수: "+m55);
System.out.println(" > 3과 5의 배수의 개수: "+m515);

 

6. 하나의 숫자를 입력받고, 1부터 입력받은 수까지의 합 출력

System.out.print("숫자 입력> ");
int m6 = sc.nextInt();
int sum6 = 0;
for(int i=1; i<=m6; i++) {
	sum6 += i;
}
System.out.println(" > "+sum6);

 

7. 두 개의 숫자를 입력받고, 첫번째 입력받은 수부터 두번째 입력받은 수까지의 합 출력

System.out.print("첫번째 숫자 입력> ");
int m71 = sc.nextInt();
System.out.print("두번째 숫자 입력> ");
int m72 = sc.nextInt();
int sum7 = 0;
for(int i=m71; i<=m72; i++) {
	sum7 += i;
}
System.out.println(" > "+sum7);

 

8. while문을 통해 반복적으로 숫자를 입력받다가 0이 입력되면 반복문 종료하기

while(true) {
	System.out.print("숫자 입력> ");
	int m8 = sc.nextInt();
	if(m8 == 0) {
		break;
	}
}
System.out.println(" > 반복문 종료");

 

9. 배열 a의 홀수의 합, 짝수 인덱스의 합 출력

int[] a = {45,78,5,69,8};
int sum91 = 0;
int sum92 = 0;

for(int i=0; i<a.length; i++) {
	if(a[i]%2 != 0) {
		sum91 += a[i];
	}
	if(i%2 == 0) {
		sum92 += a[i];
	}
}
System.out.println(" > 홀수의 합: "+sum91);
System.out.println(" > 짝수 인덱스의 합: "+sum92);

 

10. 홈페이지

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");
Scanner sc = new Scanner(System.in);
		
String[] name = new String[10];
String[] id = new String[10];
String[] pw = new String[10];
String[] date = new String[10];
int cnt = 0;
int loginIndex = -1;


while(true) {
	System.out.println("========== 홈페이지 ==========");
	
	if(loginIndex == -1) {
		// 로그인 안 했을때
		System.out.println("1.회원가입 2.로그인 3.회원목록 0.종료");
	}else {
		//로그인 했을때
		System.out.println("1.정보수정 2.로그아웃 3.내정보 0.종료");
	}
	System.out.print("메뉴 선택> ");
	int menu = sc.nextInt();
	
	if(menu == 1) {
		System.out.println("\n===========================");
		if(loginIndex == -1) {
			// 회원가입
			System.out.println("\t\t   ▷ 회원가입");
			System.out.print("이름 입력> ");
			name[cnt] = sc.next();
			System.out.print("아이디 입력> ");
			id[cnt] = sc.next();
			System.out.print("비밀번호 입력> ");
			pw[cnt] = sc.next();
			date[cnt] = dtf.format(LocalDateTime.now());
			
			System.out.println(" > "+name[cnt]+"님 회원가입이 성공적으로 완료되었습니다!");
			cnt++;
			
		}else {
			// 정보수정
			System.out.println("\t\t   ▷ 정보수정");
			System.out.println("> 정보수정을 위해 비밀번호를 확인합니다.");
			System.out.print("비밀번호 입력> ");
			String loginPw = sc.next();
			boolean find = false;
			for(String p : pw) {
				if(loginPw.equals(p)) {
					System.out.println(" > 확인되었습니다.");
					System.out.println("1.아이디 변경\t2.비밀번호 변경");
					System.out.print("메뉴 선택> ");
					menu = sc.nextInt();
					if(menu == 1) {
						System.out.println("\t\t   ▷  아이디");
						System.out.print("변경할 아이디> ");
						id[loginIndex] = sc.next();
						System.out.println(" > 아이디 변경이 성공적으로 완료되었습니다.");
					}else if(menu == 2) {
						System.out.println("\t\t   ▷ 비밀번호");
						pw[loginIndex] = sc.next();
						System.out.println(" > 비밀번호 변경이 성공적으로 완료되었습니다.");
					}
					find = true;
					break;
				}
			}
			if(!find) {
				System.out.println(" > 비밀번호가 일치하지 않습니다.");
			}
			
		}
	}else if(menu == 2) {
		System.out.println("\n===========================");
		if(loginIndex == -1) {
			// 로그인
			System.out.println("\t\t   ▷  로그인");
			System.out.print("아이디 입력> ");
			String loginId = sc.next();
			System.out.print("비밀번호 입력> ");
			String loginPw = sc.next();
			boolean find = false;
			for(int i=0; i<cnt; i++) {
				if(loginId.equals(id[i]) && loginPw.equals(pw[i])) {
					System.out.println(" > 로그인 성공!");
					loginIndex = i;
					find = true;
					break;
				}
			}
			if(!find) {
				System.out.println(" > 로그인 실패");
			}
			
		}else {
			// 로그아웃
			System.out.println(" > 성공적으로 로그아웃 되었습니다.");
			loginIndex = -1;
			
		}
	}else if(menu == 3) {
		System.out.println("\n===========================");
		if(loginIndex == -1) {
			// 회원목록
			System.out.println("\t\t   ▷ 회원목록");
			System.out.println("번호\t이름\t아이디\t기입일자");
			for(int i=0; i<cnt; i++) {
				System.out.printf("%d\t%s\t%s\t%s\n",
								i+1,name[i],id[i],date[i]);
			}
			
		}else {
			// 내정보
			System.out.println("\t\t   ▷ 내 정보");
			System.out.println("이름\t아이디\t기입일자");
			System.out.printf("%s\t%s\t%s\n",
					name[loginIndex],id[loginIndex],date[loginIndex]);
			
		}
	}else if(menu == 0) {
		// 종료
		System.out.println("\n > 프로그램을 종료합니다.\n");
		break;
	}else {
		System.out.println(" > 존재하지 않는 메뉴입니다.\n");
	}
	
	System.out.println();
}
		System.out.println("========= 프로그램종료 =========");

 


 

틀리거나 헷갈렸던 점 메모

  • DateTimeFormatter

 자주 안 써본 것이라 그런가 바로 까먹었는지 여러 방법을 혼자 해봤는데도 오류가 떠서 결국 앞에서 선생님이 알려주셨던 것을 보고 적었다.

 date[cnt] = dtf.format(); 까지는 맞췄는데 괄호 안에 LocalDateTime.now()를 적어야 한다는걸 잊었다.

 


 

전체 피드백

  • 역시 많이 해봤던 문제들이라 바로바로 풀어냈다.
  • 10번 문제를 풀면서 foreach를 써보려고 했는데 두 가지의 조건을 적을 때에는 어떻게 써야할지 모르겠어서 foreach 안에 foreach를 쓰려다 너무 복잡해질 것 같아 포기했다.
  • printf도 조금 익숙해진 것 같다. 

 


728x90
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
1 ··· 13 14 15 16 17 18 19 ··· 45