저번주로 객체 진도가 마무리된 이후 GUI 구현을 배우고 있다.
JFrame을 이용해서 윈도우 창을 만들고 기능을 하나씩 넣어보는데,
그동안 공부해오면서도 애매했던 부분들이 많았는데 조금씩 정리가 되고 있는 것이 느껴져서 정말 재밌다.
오늘은 특히 기초적인 부분이지만 새롭게 알게된 사실이 있는데,
바로 for문에서 코드가 처리되는 방식이다.
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.ButtonGroup;
import javax.swing.JFrame;
import javax.swing.JRadioButton;
@SuppressWarnings("serial")
public class RadioButtonEx extends JFrame {
Container c = getContentPane();
String[] names = {"사과", "배", "체리"};
MyItemListener listener = new MyItemListener();
JRadioButton[] radios = new JRadioButton[names.length];
public RadioButtonEx() {
setDefaultCloseOperation(EXIT_ON_CLOSE);
setTitle("Radio Button");
ButtonGroup bGroup = new ButtonGroup();
c.setLayout(new FlowLayout());
for (int i = 0; i < names.length; i++) {
JRadioButton rButton = new JRadioButton(names[i]);
bGroup.add(rButton); // 여러개 중에 하나만 선택되도록 그룹 처리
if (i == 0) {
rButton.setSelected(true);
}
rButton.addItemListener(listener);
radios[i] = rButton;
c.add(rButton);
}
setSize(300, 200);
setVisible(true);
}
class MyItemListener implements ItemListener {
@Override
public void itemStateChanged(ItemEvent e) {
for (int i = 0; i < radios.length; i++) {
if (radios[i].isSelected()) {
System.out.println(names[i]);
break;
}
}
}
}
public static void main(String[] args) {
new RadioButtonEx();
}
}
JButton 객체를 생성하고 for문을 이용해 rButton이라는 이름의 변수에 저장하고,
rButton을 radios 배열에 요소로 추가한 부분에서
하나의 변수에 여러개의 값을 넣는 것이 이해가 잘 가지 않았다.
반복문이 완전히 종료된 이후에 반복문에서 사용되었던 지역변수 등이 사라지는 걸로 생각을 했었는데,
반복문이 종료된 시점이 아니라 1회 실행된 이후 리셋, 그리고 다음 반복이 실행 되는 것이었다.
따라서 하나의 변수에 값을 여러개 넣은 게 아니라 새로 선언한 변수에 값을 저장하는 게 된다.
간단하게 살펴보면 아래와 같다.
for (int i = 0; i < 5; i++) {
int j = 0;
j++;
System.out.print(j); // 11111
}
int j = 0
for (int i = 0; i < 5; i++) {
j++;
System.out.print(j); // 12345
}
객체를 생성하고 파라미터로 전달하는 과정에서도 알게된 부분이 있다.
PhoneInfo info = new PhoneInfo();
public void PhoneBook(PhoneInfo info); {}
public void PhoneBook(new PhoneInfo); {}
위의 코드 두 줄을 아래의 코드 한줄로 쓸 수도 있다는 것이다.
값을 저장하고 다른데서 또 쓸게 아니라면 굳이 변수에 저장할 필요가 없다.
생각해보면 당연한 것이지만.. 자료형일 때는 잘만 해놓고 참조형으로 하려니까 낯설고 이게 왜 이렇게 되나 싶었었다.
PhoneInfo[] info = new PhoneInfo[10];
의 경우에는 info가 PhoneInfo 배열 타입인 것까지는 알겠는데
info[0]이 PhoneInfo[]가 아니라 PhoneInfo 타입인 것도 잘 몰랐었고..
하지만 이것도 참조형이 아니라 자료형이라 생각해보면 바로 답이 나온다.
오늘 새로운 개념 공부와 실습 이후
JFrame을 활용하여 두개의 파일로 클래스와 기능을 나누어 1~100 숫자 맞추기 게임 만들기를 했다.
생각보다 시간이 꽤 걸렸지만 어쨌든 주어진 시간 안에 모두 구현해서 많이 뿌듯했다.
아직 가야할 길이 멀고도 험난하지만..! 아무것도 모르던 3주 전과 비교하면 엄청난 발전이니 더욱 열심히 해야겠다.