20210930 9월의 마지막.

DUUUPPAAN·2021년 9월 30일
0

교육 20210915~ Java

목록 보기
11/13

·졸업 실습에 발표 참관

-사실 참관이라고 하기엔, 애초에 비대면 수업이기 때문에, 발표를 하는 zoom에 참여해서 발표를 본 것 뿐이었다. 그래도 굉장히 흥미로웠다.
사실 세 팀이 만든 페이지(?)들의 실용성(?)에 대해서는 조금 의구심이 있긴 했다. 실제로 저런 서비스를 제공하는 페이지가 있다면 과연 사람들이 찾을까싶은 의문점이 있었다. 하지만, 해당 서비스의 실제 적용 예상을 하는 수업은 아니었기 때문에, 굳이 해당 부분을 질의하지는 않았다. 페이지의 완성도를 보는 것이고, 어떻게 구상했는지 어떤 툴을 사용했는지, 기능들이 잘 구현이 되었는지를 보는 수업이었기 때문에, 해당 부분들을 자세히 들으면서 봤고, 굉장히 신기하면서도 뭔가 기대가 되었다. 나도 나중엔 저정도 수준으로 구현할 수 있을까에 대한 두근거림이 있었다. 또한, 처음 기획단계의 플로우차트를 봤는데, 굉장히 잘 짠 듯한 느낌이 있어서 나도 저렇게 짤 수 있을지가 궁금했다. 지금 내 수준에서 플로우 차트는 사실 굉장히 단순해서 애초에 짜지 않는 경우가 많고, 짜더라도 마름모 3개정도면 끝나는 수준이라, 좀 더 복잡한 프로그램을 짰을 때 어떻게 될 지 궁금했다.

·오후 수업, 인터페이스

-인터페이스에 대해서 배웠다. 추상메소드 추상 클래스와 굉장히 유사했다. 틀의 개념으로 접근했다. 하지만 추상 클래스와 엄청난 차이가 있었는데, 보통 이중 상속이 허용되지 않는 자바인데, 인터페이스로는 양쪽에서 상속을 받을 수 있었다. (이게 상속이라고 말해도 될지는 모르겠지만...) 어차피, 메소드 자체가 정의되어 있지 않기 때문에, 양쪽에서 상속받는다고 해도 크게 문제될 것이 없기 때문이라고 한다. 단, 추상 클래스와 큰 차이점이 있는데, 추상 클래스는 기본적으로 객체 생성이 불가능 하더라도, 정의되어 있는 메소드를 가질 수 있다. 해당 메소드를 사용하려면 자식 클래스가 상속받아서 자식 클래스의 객체를 통해 사용해야겠지만, 정의된 메소드를 가질 수 있다. 그러나 인터페이스는 정의되어 있는 메소드가 있으면 안된다. 정말 말 그대로 어제 내가 추상 클래스에서 느꼈던 틀 그대로의 느낌이었다.

-수업에서 진행한 예는 조금 달랐는데, 우선 나는 내 느낌대로 인터페이스를 사용해봤다.

package PracInterface;

interface Fruit {
	int cs = 100;
	
	int showP();
	String showN();
	int showF();
}

인터페이스1

package PracInterface;

interface Popularity {
	String pp(int fresh);
}

인터페이스2

package PracInterface;

public class Apple implements Fruit, Popularity {
	int price = 10000;
	String name = "사과";
	int fresh = 75;
	@Override
	public int showP() {
	System.out.println("가격: "+price);
	return price;
	}

	@Override
	public String showN() {
	System.out.println("이름: "+name);
		return name;
	}

	@Override
	public int showF() {
	int result=0;
	result = fresh*cs;
	System.out.println("신선: "+result);
	return result;
	}

	@Override
	public String pp(int fresh) {
			if(fresh > 50)
			return "인기 많음";
			else if(fresh>30) {
			return "적당한 인기";
			}
			else {
			return "판매 지양";
			}
		
	}


}

인터페이스 두 개를 implements로 받아서 오버라이딩 한 자식 클래스.

package PracInterface;

public class Main {

	public static void main(String[] args) {
	Apple ap = new Apple();
	ap.showN();
	ap.showP();
	ap.showF();
	System.out.println(ap.pp(ap.fresh));
	}

}

메인 클래스, 최대한 짧게 짜여지게 하고 싶어서 아주 간결하게 만들어봤다.

·거스름돈 코딩

-오늘 오후에는 원래 이론 공부 조금하고 문제를 여러개 내준 후 직접 해보는 방식으로 진행하신다고 하셨는데, 하나만 진행했다. ㅠㅠ
좀 더 많이 해보고 싶었는데, 아직 그럴 수준이 아닌것인지는 잘 모르겠지만, 그래도 열심히 짜봤다.

package exchange;

import java.util.Scanner;

class ExchangeM{
	void exchangeM(int result) {
	
	int th=result/1000;
	System.out.println("1000원 : "+th);
	int hd=(result%1000) /500;
	System.out.println("500원 : "+hd);
	int xx= (result%1000)%500;
	int hd2= xx/100;
	System.out.println("100원 : "+hd2);
	int tn5 = (xx%100)/50;
	System.out.println("50원: "+tn5);
	int tn = ((xx%100)%50)/10;
	System.out.println("10원: "+tn);
	}

}

public class Main {
	public static void main(String[] args) {
	Scanner sc = new Scanner(System.in);
	System.out.println("물건 가격을 입력해주세요: ");
	int price = sc.nextInt();
	System.out.println("지불한 돈을 입력해주세요: ");
	int submitC = sc.nextInt();
	int result = submitC-price;
	if(result<0) {
		System.out.println("돈이"+(-result)+"원 부족합니다.");
	}
	else if(result==0) {
		System.out.println("돈을 내지 않으셨습니다.");
	}
	else {
		System.out.println("거스름 돈: "+result);
		ExchangeM em = new ExchangeM();
		em.exchangeM(result);
	}
	
	}

}

물건 값과 지불 값을 입력하고 거스름돈을 1000원짜리부터 몇개씩 줘야 하는지 프로그램을 짜보라고 하셨다. 결론부터 말하자면, 교수님의 코드와 정말 많이 달랐지만, 그래도 프로그램은 성공적으로 작동했다. 좀 이상한 부분이 있는데, 나누는 값들이 너무 길어져서 중간에 해당 값을 xx라는 변수에 넣어줬다. 계속 변수에 넣어주면 그게 더 큰 일이 될 것 같아서 지나치게 길어질 것 같은 중간에 한번 정도 변수에 넣어줬는데, 나중에 보니 일관성이 조금 결여된 것이 아닌가 싶긴 했다.

·File FileWriter FileReader

-남은 시간들에는 File과 FileWriter FileReader 등을 사용해봤다. 사실 아직도 익숙하지 않다. FileWriter를 쓰려면 File을 객체로 설정해야하고, 또 그 객체를 FileWriter의 객체 생성자 부분에 넣어줘야 하고, 또 FileWirter를 사용하고 닫아줘야 하고, 신경 쓸 게 너무 많았다. 또 아직은 낯선 예외처리를 위한 try catch문을 사용해야 하고 예외처리도 넣어줘야 하기 때문에 더 낯선 느낌이었다. 다만 오늘 진행하고나서 개인적으로 좀 깨달은 사실이 있는데, 예외처리가 있기 때문에 코딩이 오류가 있어도 진행이 되는 느낌이었다. 보통같으면 오류가 떠야 정상인 상황도 예외처리를 해서 코드 자체가 진행이 되는지 여부는 알 수 있는 것 같아서, 아~ 이래서 예외처리를 하는구하 하고 깨닫게 되었다.
FileReader는 그래도 읽어오는 것이라 이해가 좀 더 수월하긴 했는데, 몇 가지 주의할 점이 있었다.

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class FileReadPrac {

	public static void main(String[] args) throws FileNotFoundException {
	File file = new File("c:\\temp\\phone.txt");
	FileReader ff = new FileReader(file);
	try {
	while(true) {
		int c= ff.read();
		if(c == -1) break;
		System.out.print((char)c);
	}
	}
	catch(IOException e){
		System.out.println("파일을 읽어오는데 오류가 발생했습니다.");
	}

	}

}
  1. 우선 파일을 읽어오고 출력하고 싶다면 반복 출력을 하기 위해 반복문이 필요하다.
  2. FileReader의 read() 기능은 문자열의 끝을 만나면 -1을 리턴한다. 이 부분을 수업 때 설명해주지 않으셨다. 그래서 혼자 한참 뜯어보면서 고민하다가 결국 구글링을 해서 궁금증을 해소했다. 즉, 위의 조건문은, 문자열의 끝을 만나면 더이상 반복문을 실행하지 말고 break하라는 조건이었다.
  3. 왜 굳이 (char)를 써주는지 궁금했다. 검색해보니, 위에서 언급했듯이 read()는 문자열의 끝에서 -1을 리턴해준다. 그렇기 때문에, read()라는 메소드의 리턴타입은 int인 것이다. 그래서 문자를 출력하기 위해서 형변환을 통해 char로 변경해주는 부분이었다.
    위의 2,3번을 이해하고 나니 훨씬 이해가 쉬웠다.

·Scanner

-그간 스캐너의 기능을 콘솔에서 입력값을 넣는 기능으로 완전히 착각하고 있었다. 그도 그럴 것이 입력값을 받는 코드를 작성할 때는 무조건 넣었으니까... 그러나 결국은 콘솔창에서 내가 입력하는 것은 Scanner뒤의 괄호 안에 System.in을 넣었기 때문이다. 즉, 사실 System.in이 입력값과 더 가까운 것이다. Scanner는 정말 말 그대로 읽어오는 기능을 하는 것이었다. 이렇게 요즘말로 닉네임 값을 하는 녀석을 그동안 오해하며 사용하고 있었다니... 새삼 놀라면서 Scanner를 다르게 활용한 오늘의 코드를 자세히 뜯어봤다.

FileWriter fw = null;
	File f = new File("c:\\temp\\phone.txt");
	
	try {
		fw = new FileWriter(f);
		//FileWriter fw = new FileWriter(f);를 사실상 나눠 써준 것.
		Scanner sc = new Scanner(System.in);
		System.out.println("전화번호 입력 프로그램입니다.");
		while(true){
			System.out.print("이름 전화번호(종료: \"그만\")>> ");
			String line = sc.nextLine();
			if(line.equals("그만")) break;
			fw.write(line+"\r\n");
		}
		System.out.println(f.getPath()+"에 저장됨.");
		
		sc.close();
		fw.close();
	}
	catch(IOException e) {
		e.printStackTrace();
	}

·책의 반에서 끝나는 책?

-책의 진도를 다 나가지 않는다고 하셨지만, 벌써 책에 반이 남았는데, 중점적으로 살펴볼 페이지만 몇 부분 체크해주시고 내일은 서버 얘기를 하신다고 하셨다.....아니 벌써? 물로 뒤에는 메소드에 관한 내용이 좀 많은 것 같지만, 이정도 수준에서 끝낸다니 너무 이상했다. 아무래도 나머지 부분은 독학하는 시간을 갖고 내가 충분히 연습해 보는 것이 좋을 것 같다. 마침 대체 공휴일 월요일도 있기 때문에 더 적절한 시간일 것 같다. 그래도 빠르게 진도를 나가면서 틀이 잡혀 있는 상태에서 뭐라도 독학하면 더 좋겠다고 생각했다. 그래서 단순히 부정적이지만은 않다.

영어 공부와 운동도 꾸준히 하고 있고, 정리도 복습도 개인적으로 나쁘지 않게 하고 있다고 생각한다. 한달... 이제 겨우 한달 지났는데, 아직 너무 큰 산들이 많은 것 같긴 해도 잘 해온 것 같다. 이렇게 유지하면 나중에는 익숙해질 날이 있을 것이라 생각한다. 파이팅!!

profile
비전공자란 이름으로 새로운 길을 가려 하는 신입

0개의 댓글