일을 잘 하고 있던 어느 날 팀원 분이 다음의 코드와 비슷한 상황을 보여주며 물었다.
import java.util.List;
class Scratch {
public static class Test{
public String t;
public Test(String t){
this.t = t;
}
}
public static void main(String[] args) {
Test ta = new Test("a");
List<Test> tests = List.of(ta);
for (Test test : tests) {
Test test1 = test;
test1.t = "d";
}
System.out.println(ta.t);
}
}
for문 안에서 새로 변수를 선언해서 값을 바꿨는데 왜 'd'가 출력되나요? 'a'가 나와야 하는 것 아닌가요?
다 같은 객체니까요...
디버그 모드를 켜서 각 단계에서 객체들이 같다는 것을 보여드리면서 아는대로 설명을 해드렸다.
저런 질문을 하실 분이 아니었는데 과도한 업무에 시달려 제대로 된 사고를 못하신 것 같다는 생각을 하면서 다른 팀원분들도 불러서 똑같은 부분을 물어보니 제대로 답하는 분이 절반밖에 되지 않았다. 다들 과도한 업무에 시달리고 계시는구나...
그래서 나도 평소에 자주 헷갈렸던 내용들과 검색해서 찾은 문제로 Java Quiz를 하기로 했다.
문제는 총 4개를 준비하였다.
class Scratch{
public static class Quiz{
public String answer;
}
public static void change(Quiz q1, Quiz q2){
q1.answer = "new";
q2 = new Quiz();
q2.answer = "new";
}
public static void main(String[] args) {
Quiz q1 = new Quiz(); q1.answer = "old";
Quiz q2 = new Quiz(); q2.answer = "old";
change(q1, q2);
System.out.print(q1.answer);
System.out.print(" ");
System.out.print(q2.answer);
}
}
첫번째 문제는 함수 호출 시 객체 자체가 함수 내부로 전달되는 것이 아니라는 것을 확인 하기 위한 문제이다. 실행 결과에는 'new old'가 출력된다.
class Scratch {
public static void main(String[] args) {
String a = new String("12");
String b = new String("12");
System.out.print(a==b);
System.out.print(" ");
System.out.print(a.equals(b));
}
}
두번째 문제는 String
을 비교하는 것에 관한 문제이다. 사실 나는 new
를 통해 String
을 생성해도 String pool에서 가져오는 줄 알고 있었는데 당연하게도 아니었다. 실행 결과에는 "false true"가 출력된다.
import java.util.Arrays;
import java.util.List;
class Scratch {
public static void main(String[] args) {
List<Integer> list = Arrays.asList(1, 2, 3);
try{
list.add(4);
}catch(Exception e){
System.out.println("예외 1 발생");
return;
}
try{
System.out.println(list.size());
}catch (Exception e){
System.out.println("예외 2 발생");
}
}
}
세번째 문제는 검색하다가 처음 알게 되었는데 Arrays.asList
가 반환하는 결과에는 add
라는 메소드가 정의되어 있지 않아서 실행 결과에는 '예외 1 발생'이 출력된다.
import java.util.ArrayList;
import java.util.List;
class Scratch {
public static void main(String[] args) {
try{
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
for (String s : list) {
if(s.equals("b")) list.remove(s);
}
System.out.println(list);
}catch (Exception e){
System.out.println("예외 발생");
}
}
}
문제 4는 향상된 for문으로 리스트를 순회하던 중 중간의 요소를 삭제하면서 ConcurrentModificationException
이 발생해서 실행 결과에는 '예외 발생'이 출력된다.
예전에 프로그래머스 스터디에 참여하면서 담당자분이 'Kahoot'이라는 서비스로 아이스 브레이킹을 위한 퀴즈를 진행하였는데 참여해보니 꽤 재미있었다. 각각의 참여자는 각자 링크에 접속해서 문제를 풀면되는데 중간 중간 리더보드가 나와서 게임처럼 진행할 수 있었다.
나도 비슷한 퀴즈를 만들어보고 싶었는데 Kahoot은 참가자 3명까지만 무료로 퀴즈를 만들 수 있었다. 과자 사는 것보다 소프트웨어 결제하는 것이 더 어려운 회사의 법인 카드로는 결제를 할 수 없었다. 그래서 알아보니 Mentimeter(https://www.mentimeter.com/)라는 서비스가 있었다.
멘티미터는 소개를 보니 설문조사나 퀴즈 같은 것들을 슬라이드 형식으로 진행할 수 있는 것 같았다. 실제로도 퀴즈를 만드는 페이지가 구글 슬라이드와 많이 유사했다.
Ahaslide같은 다른 서비스 몇개도 비교해보았는데 무료로 쓸 수 있는 것 중에서는 그나마 Mentimeter가 가장 나은 것 같아서 멘티미터로 퀴즈를 준비하게 되었다.
사실 다른 서비스들도 마찬가지였는데 코드를 깔끔하게 보여 줄 수 있는 방법이 없었다. 코드를 텍스트 칸에 붙여넣으면 줄바꿈, 들여쓰기가 무시되거나 강제로 가운데 정렬 되는 등 구문 강조 까지는 안되더라도 정렬을 제대로 되었으면 했는데 이게 쉽지 않았다. 심지어 퀴즈에 150자까지만 입력이 가능해서 문제에 코드를 보여주는 부분이 굉장히 어려웠다.
결국 모든 코드는 캡처해서 이미지로 입력할 수밖에 없었다. 이 방법도 이미지의 세로 길이가 길면 보기가 이미지를 가리게 되어서 최대한 세로로 길어지지 않게 이미지를 맞춰 주어야 했다.
상품으로 사용할 작은 위스키 한 병을 준비하고 주간 회의 시간에 퀴즈를 진행하였다. 상품 때문이었는지는 모르겠지만 팀원분들 모두 열심히 참여해주셔서 재미있게 진행할 수 있었다.