0719 첫째날부터 왕창 배운다.

 반복문 제어 

평소에는 지양하지만 알고리즘 문제를 해결하다 보면 이중 반복문을 사용하게 되는 상황이 자주 있다. 이 때 특정 조건에 따라 continue와 break를 적용 시키는 상황이 있는데, 항상 가장 안쪽의 반복문에 대해서만 제어가 되는거라 임의의 flag변수를 두어서 이를 통해 불편하게 제어하곤 했다. 오늘 싸피 수업에서 자바 기초적인 부분을 듣고 있는데 해당 질문이 문제에 있어서 생각하고 있었는데 댓글로 라벨링이 올라는것이었다. 교수님도 당연하게 라벨링을 사용하면 되죠? 라고 하시고 넘어갔는데, 이를 처음 들은 나에게는 신세계... 이후 이에 대해 조금 찾아보고 정리 하려고 이 글을 작성하기 시작했다. 

라벨링

 


for이나 while 같은 반복문 앞에 '이름 :' 의 형태로 라벨을 남겨주면 내부에서 break, continue 와 같은 제어문을 사용할 때 해당 라벨을 남겨 줌으로써 쉽게 위치를 지정해 줄 수 있다. 사용법도 내용도 직관적이고 간단해서 지금 알아두면 알고리즘 해결에서 꽤나 유용하게 쓸것 같은 느낌이다. 이렇게 기초부터 새로배우면 하루에 하나는 얻어 가는 느낌이라 나쁘지 않은 수업이 될 수 있다. 

자바 입력

보통 자바에서 출력을 사용할때는 System.out 객체를 사용하곤 한다. 물론 콘솔에 직접 찍어보는건 점점 지양해야 한다 하지만 기초 자바를 배울 때나 잠깐 콘솔에 찍어볼때는 유용하게 쓰이는 데, 이후 입력에 관한 부분은 점점 아에 사용을 안하기 때문에 종류가 더 많음에도 불구하고 대충하고 넘어갔던 기억이 있다. 

출력이 저런 객체라면 입력은 기본적으로 System.in 이라는 객체다. 해당 객체의 read() 메서드를 사용한다는데, 나는 이것또한 이번에 처음 들었다. 처음부터 Sacanner 객체를 통해 입력을 받는 방법을 배웠는데, 이때도 System.in 이 당연히 들어간다. 차이점은 아래와 같다.

System.in.read(); 

아스키코드 값을 리턴하기 때문에 '0'입력 시 48, 'A'입력 시 '65'를 뱉어낸다. 그래서 바로 int에 저장할 수 있고, 이를 char형으로 바꾸면 문자형태로 저장도 가능하다. 하지만 한글자씩 밖에 사용이 안되고, enter에 대한 예외처리도 필요하다. 



BufferdReader.readline();

처음 입력한 문자열 부터 엔터 바로 이전에 입력한 문자까지를 문자열로 프로그램에 전달, 즉 char처럼 문자 하나하나가 아니라, 문자열을 입력하여 그대로 String 에 저장할 수 있다. 다만 문자열의 형태로 저장 되기 때문에, int형으로 변환하려면 parsing 과정을 거쳐야 한다.

Scanner.next();

이제 가장 최신에(그래도 자바5에 나왔다고 한다.) 나온 방법인 Scanner 고 나는 처음 자바를 배울 때 그냥 이방법을 쓰라고 들었다. 그래서 이거밖에 없는줄 알았지만 이제 근-본도 조금은 알아야 하지 않나 싶어서 정리를 하고 있다. 문자열을 그대로 받을 수도 있으며, 객체 생성도 BufferedReader에 비해서 쉽다. 입력받을 형태에 대해서 메서드가 따로 정해져 있기 때문에 자료형이 일정하다면 parsing 과정또한 생략 될 수 있다. 다만 편리하게 만들어놨기 때문에 속도가 느리다. 따라서 속도를 좀더 요구할 수 있는 알고리즘문제에서는 경우에 따라 BufferedReader를 쓰는 게 나을 수도 있다는 교수님 말씀.

지금 보니까 얘는 IOException 에 대한 예외처리도 필요없는 듯 하다. 다만 마지막을 보면 next()와 nextLine()이 모두 String 에 저장되는 걸 볼 수 있는데, 

next()는 공백 단위로 문자열을 읽는다.


nextLine()는 Enter 단위로 문자열을 읽는다.


이와 같은 차이점이 있으니, 짧은 단어를 입력받을 것인지, 문자을 입력받을 것인지에 따라 다르게 메서드를 사용해야 할듯 싶다.

그리고 기본형인 System.in 은 뒤의 두가지 방법에서 모두 참조하고 있긴하다. 바로 '표준입력방식'이라고 하는데 이제는 조금 더 알고 쓰지 않을까. 


댓글

이 블로그의 인기 게시물

git-receive-pack not permitted on 깃 허브 로그인 관련 문제