어젠 비교적 할 과제를 1차원 적으로는 빨리 끝내서 조금 일찍 잠들러 갈까 ..? 내일 아침에 어차피 일찍 일어나야 하는데 싶었지만 잠이 오는 상황은 아니라 다시 과제를 보충했다.
끝까지 어떻게든 해낸다는건 너무 뿌듯하다.
사실 위의 느낌을 잘 몰랐었는데 요새는 조금 어제, 그제 느끼는 것 같다. 그래서 아 그래 관심사의 분리까지 하고 자자! 라고 마음먹고 어떻게든 메소드화시키고 분리는 대충 시키고 잤다.
끝까지 해냈더니 다음날 할 게 있었다.
어제 그러지 않고 그냥 자버렷다면 아침에 관심사의 분리나 적당히 하다가 정규시간을 들어갔을 건데 오늘은 또 소득이 있었다. 바로 분리를 시키니 코드는 그대론데 기능 작동이 제대로 되지 않는 것!
예전에는 작동이 안되면 어디서 건드려야할 지 멘붕이었는데 요새는 침착한거 보니 코드라는 구조를 내가 조금 이해는 하고 있나보다.
필드화
항상 이놈의 정의를 내리고 정리하려고 블로그에 몇 번의 글을 썼는지 모르겠다. 꽤나 간단하다. 사용법이 다양해서 그렇지.
말그대로 필드(field) 그 클래스 필드의 어디서나 인식되기 위한 멤버변수이다.
멤버변수와 전역변수를 많이들 헷갈리는데 사실 엄연히 다르다. 전역변수는 함수의 외부에서 선언된 변수이고 프로그램의 어디서나 접근할 수 있으며 프로그램이 종료되어야만 메모리에서 사라진다.언듯 들으면 static과 상당히 비슷한데 자바는 객체지향적언어이기 때문에 애초에 전역변수의 개념을 허락하지 않는다고 한다.
Global variables are not technically allowed in Java. A global variable is one declared at the start of the code and is accessible to all parts of the program. Since Java is object-oriented, everything is part of a class ... A static variable can be declared, which can be available to all instances of a class.
그럼 static은 뭔데? 모든 클래스에서 불러올 수 있잖아?
static이 가비지 컬렉터를 거치지 않고 바로 메모리에 얹혀져서(아 이 표현말고는..)쓰여 모든 클래스에 접근이 가능하긴 한데 이것은 그냥 스태틱은 객체생성 없이 모든 클래스에 접근이 가능하다. 로 알고 있으면 될 것 같고 그렇지만 엄연히 전역변수는 아니다.
자 다시 필드화와 변수의 사용처
그래서 필드화 시킨 이 멤버변수를 어디에 쓰느냐? 고 하면
이전에는 그냥 다른 클래스에서 선언된 메소드의 매개변수(패러미터)를
this.variable = variable 로 이어주기 위해서라고 만 생각했다.
아 정말 매개변수니 패러미터니 처음에 너무 알아듣기 어려워서 나같은 초보개발자 분들 보라고 좀 쉽게 용어를 하고싶은데 그럴수가 없다. 결국 기본적인 용어는 사용하면서 알아야 하는듯. (하긴 주짓수도 아무리 쉽게 설명하려고 해도 용어 다 나와야한다...)
위의 저것을 개념을 가지고 프로그래밍을 하니 관심사의 분리를 할 때 아주 대환장 파티를 한다. 심지어 코드를 다 짜두고 분리하는것이 아니라 내가 아는 개념에서 클래스와 패키지 메소드까지 분리하려고 하니 ㅋㅋㅋㅋㅋ 정말 ㅋㅋㅋ 가관이네 생각해보니 그러니 아무것도 작동이 안되지. 자동차 기어랑 어떻게 작동하는지 겨우 배워두고 처음부터 스포츠카 만드려고하는 격. RC카 처럼 그냥 바퀴랑 엔진만 달린거부터 만들었어야하는데 말이다.
다시 한 번 필드화는 그 클래스 필드내에서 어디에든 접근 가능하다.
그게 끝이다. 단 활용법이 많다.
나는 필드화 물으면 저렇게 답해주는 사람이 제일 싫었다. 아니 그게 끝이라고? 근데 왜이렇게 활용법이 많은데 싶었는데 진짜 저 기능하나에서 나오는 것이었다. 엊그제 물어본 '관심사의 분리'는 어떻게 하는건데요? 에 대한 답으로 객체 지향적으로요 ^^ 랑 비슷한 개념인듯.
내가 여태 정리한 필드 사용법
1. 선언한 클래스내에서 어디든 호출하고 접근
-> 메소드1 , 메소드2 등 여러곳에서 같은 변수(객체)를 쓰려고 할 때 매개변수로 받을 필요 없이 그냥 바로 메소드 내에서 쓸 수 있다. -> 아니 매소드의 매개변수로 받으면 되잖아? -> 값이 변하는 것이 아니라 고정되어있는 객체의 경우는 바꿀 일이 없는데 이걸 매번 옆에 매개변수로 받으면 관리도 너무 어렵고 개피곤해진다.
예를 들면 (지금 스윙하고있으니 스윙 기준으로) 스윙에서 텍스트필드나 프레임 레이블 이런것들은 기능적 요소 보단 하나를 선언하면 계속 두고 쓰는 틀 같은거라서 바꿀일이 없기때문에 그냥 필드화 시켜두면 메소드나 뭐든 할 때 편한다.
2. 클래스 끼리 공통된 변수를 메소드를 이용해 처리할 때
클래스간의 분리를 하고나면 자바에서는 이 변수 자체를 들고 오는 경우는 없는데(나도 처음에 이게 이해가 안됨, 아니 그냥 그거 들고오면 되지 같은 비슷한 단어에 괄호치고 뭐하는거지 저게? 싶음 -> 비슷한단어에 괄호가 메소드 말하는 거임) 이러한 변수를 메소드를 선언해서 리턴해서 가져오는 경우가 많다.( 이거를 getter라고 하던데 심지어 getter조차 권장되지 않는다길래 찾아보니 변수자체를 들고온다,게터로 그대로 리턴해서 가져온다의 의미가 결국 그 변수 원본 값 자체에 변화를 주는 것이라 나중에 프로그램의 수정이나 보수할 때 원본 데이터에 장난치다가 큰 일날 수 있어서 그런 것 같음. 그래서 변형게터 or 원본 변수 값과 똑같은 것을 다시 생성해서(복사해서) 가져오기도 하는 듯)
아무튼 클래스로 분리하여 객체별로 관리한다고 하더라고 그럴수록 이 객체를 이어주는 변수들은 독립적이어야하면서도 동시에 유기적이어야한다.(한마디로 너랑 나랑 문제있으면 남남이라 상관은 없는데(남남이라 프로그램 문제시 처리 편함) 그래도 같이 있을땐 일은 해야하니까 유기적으로 잘 지내야지(남남이지만 유기적으로 프로그램이 동작은 잘되야함) 이런 느낌) -
원본체인 나루토는 다치면 안되니까 분신인걸 소환해서 이용하는데 대신 그 분신은 본체인 나루토와 똑같은 기능을 해야하고 또한 컴퓨터가 이 분신나루토가 본체 나루토와 같다고 인식시켜줘야 그제서야 분신이 작동하기 시작함. 그전까진 그냥 생긴것만 똑같거나 이런 느낌
또 비유에 빠져서 말이 길었는데
하나의 메인 클래스에서 모두 작업을 처리하는 게 아니고 클래스로 분리를 해준다면 메인 클래스에서 작동하는 변수들이 메인클래스를 기점으로 각 클래스끼리 유기적으로 연결되어있어야한다.(그래야 컴퓨터가 클래스에서 클래스로 데이터를 넘겨 줄 수 있으니까 보통 this.변수명 is null 하면 그 연결점을 못찾는다는 뜻인듯) 그 연결 파트가 메소드의 패러미터가 되거나 혹은 너무 많은 메소드들이 공통으로 받아쓰고 있다면 클래스 변수를 필드화 시켜서 이어줄 수 도 있다.
일단 이정도 인데 저 위의 두개가 사용법이 무궁무진해서 내가 설명하고도 아쉽다. 역시 많은 예제를 통해서 배우는게 최고다. 오늘 다시 이렇게 정리하게된 이유는 1번과 관련이 있고 또 차후에 2번과 관련이 생긴다.
Todo List 만들기 중 x 버튼 클릭시 삭제되는 코드를 짜던중
addTodoButton.addActionListener(event -> {
// createPairPanel();
JPanel pairPanel = new JPanel();
pairPanel.setLayout(new GridLayout(1,2));
toDoCheckBox = new JCheckBox(textField.getText());
pairPanel.add(toDoCheckBox);
JButton xButton = new JButton(" X ");
xButton.addActionListener(xEvent -> {
// updateDisplay();
listPanelOnContentPanel
.remove(pairPanel);
listPanelOnContentPanel
.setVisible(false);
listPanelOnContentPanel
.setVisible(true);
// addNumberOfButtons();
numberOfButtons.add("button");
});
위처럼 짰을때는 작동이 잘되다가 x버튼의 액션리스너를 메소드화 시키니 가장 최근에 동작한 버튼만 지워지는게 아닌가?
(사아아알짝 멘붕왔는데 아침이라 갠츈)
그래서 다시 코드를 천천히 살펴보았는데 이전에 물어본 개념의 연장선이었다.
계산기 버튼을 만드는 상황 -> 버튼을 반복적으로 형성해서 반복문 사용
버튼을 위처럼 만들어주는데 아니 모든 버튼의 이름이 button 이라는게 이해가 안되었다. (모든 변수는 각기 다른 변수명을 가지고 있어야한다고 생각했음)
근데 이게 착각인게 변수명이 다른 이유는 사용자(개발자) 잘 알아보기위해 붙여주는 언어인 것이고 사실 이 변수는 컴퓨터가 각기 다르게 인식하고 다른 메모리 주소를 할당하고 있으면 상관이 없다.
저 상황에서 button 은 지역변수이기때문에
변수 - 데이터를 넣기위해 할당받은 메모리 공간
지역변수 - 지역안에서만 생성되고 실행되는 변수로 함수가 끝이나면 메모리에서 사라진다.
따라서 저 반복문안에서 우리가 인식하기엔 이름을 모두 button 으로 주었지만 저 실행이 끝나는 시점에서 변수는 사라지므로 button이라는 변수가 또 다음 반복작동이 되면서 만들어질 수 있다.
-> 이 개념을 다시 위 코드에 적용하면
메소드화를 시키지 않았을때는 .remove(pairPanel) 이라고 해도 어떤 페어패널인지 컴퓨터가 인식을 하고 해당패널을 지우는데 이것을 매소드로 분리시킨 후 pairPanel을 인식시키기 위해 필드화 해주는 순간 pairPanel 은 단 하나의 객체가 되고 그것은 가장 마지막에 생성된 패널일 것이다. 따라서 어떤 x 버튼을 눌러도 최근에 생성한 버튼만 지웠던 것.
액션플랜
이제 드디어 문제가 생기면 왜 그런문제가 생기는지 조오금 보이고 원인을 파악해서 해결이 조오금 가능한데 그렇다면 이제 관심사의 분리를 위해서 분리해주며 저 각 pairPanel ( 체크박스와 할일텍스트와 x버튼이 들어있는 패널)을 어떻게 각 개별 객체로 인식시켜 버튼이 작동할 수 있는지 오늘까지 찾아보고 블로그에 정리
'개발공부하며 느낀 인생 공부' 카테고리의 다른 글
복습의 복습의 복습 이월된..주간회고[메가테라 9주차라 쓰고 이월 3주차 회고] (0) | 2022.07.08 |
---|---|
List 와 ArrayList 알기 쉽게 간단 정리와 활용 (0) | 2022.07.06 |
프로처럼 일하고 공부하기 [이이일찍 쓰는 220705 TIL] (0) | 2022.07.05 |
혼자 보다 둘이 낫고 같이 가야 빨리간다.[220704 TIL] (6) | 2022.07.05 |
내가 보려고 정리하는 자바 용어[계산기 + 마카오뱅크] (0) | 2022.07.04 |
댓글