프로그래머스 문제 [공원 산책]을 풀며 고민한 흔적을 남기고자 합니다.
보다 효율적이고 좋은 코드를 작성하신 분들도 많겠지만 나름 읽기 쉽게, 기능을 분리하는데 초점을 맞추어 좋은 코드를 작성하려고 노력하였습니다.
저는 solution 매서드에서 기능을 분리하여 작성한 여러가지 매서드를 사용하여 풀어보고 싶었습니다.
publc class Solution{
public static int[] solution(String park[], String[] routes) {
getStartPosition(park, now); //S 위치를 찾고 now 배열에 할당
}
public int[] getStartPosition(String[] park, int[] position) {
// 시작 위치 찾는 중
}
}
위의 코드는 실행 되지 않습니다. 클래스 매서드에서 인스턴스 매서드를 사용할 수 없기 때문입니다.
위의 코드를 실행 가능한 코드로 수정하는 방법에는 크게 두가지가 있습니다.
첫번째 방법은 Solution 객체를 생성하는 것입니다.
publc class Solution{
public static int[] solution(String park[], String[] routes) {
Solution solution1 = new Solution();
solution1.getStartPosition(park, now);//S 위치를 찾고 now 배열에 할당
}
public int[] getStartPosition(String[] park, int[] position) {
// 시작 위치 찾는 중
}
}
두번째 방법은 getStartPosition 매서드를 static 매서드(클래스 매서드)로 선언하는 것입니다. 클래스 매서드는 코드가 실행될때 바로 메모리에 적재 되기 때문에 solution 매서드에서 getStartPosition 매서드를 사용할 수 있게 됩니다.
publc class Solution{
public static int[] solution(String park[], String[] routes) {
getStartPosition(park, now); //S 위치를 찾고 now 배열에 할당
}
public static int[] getStartPosition(String[] park, int[] position) {
// 시작 위치 찾는 중
}
}
클래스 매서드로 사용하면 매서드의 호출이 빨라진다는 장점이 있습니다.
하지만 현재 문제풀이 에서는 전부 인스턴스 변수 와 인스턴스 매서드로 구현하여 풀이해도 무방합니다.
처음 코드를 작성할때 클래스에서 선언한 변수를 클래스 안에서 정의한 매서드에서 자유롭게 사용 가능한 것으로 생각했습니다. 맞습니다.저는 Static 매서드에서 인스턴스 변수를 사용하려 했던 것이죠.
당연히 큰 착각이었고 이번 계기를 통해 변수의 종류(인스턴스 변수,클래스변수 ,지역변수)에 대해 고찰해보는 계기가 되었습니다.
( 말로 표현 할 수 없는...어떠한 구조들이 머릿속에 조금 더 체계적으로 수립되고 있는 듯한 느낌을 받았습니다. )
먼저 저의 실패한(?) 코드를 살펴봅시다.
public class Solution{
int high;
int width;
public static int[] solution(String park[], String[] routes) {
high = park.length;
width = park[0].length();
//
return now;
}
}
high 와 width 는 인스턴스 변수입니다. 하지만 solution 매서드는 클래스 매서드 입니다.
클래스 매서드는 프로그램이 실행되며 메모리에 적재 되죠. 따라서 객체가 생성될때 메모리에 할당되는 인스턴스 변수는 클래스 매서드에서 사용할 수 없습니다.
반대로 정적 변수는 클래스 매서드에서 사용할 수 있습니다.
위의 코드를 수정하는 방법은 인스턴스 변수를 클래스 변수로 바꾸어 주거나
매서드를 인스턴스 매서드로 바꾸어 주도록 하는 것입니다.
현재의 위치인 now 배열의 값을 movePosition 매서드를 통해 변경 하고 싶었습니다.
public static int[] movePosition(int[] position, char para_direction, int para_distance) {
int[] movedPositon = position
// 특정 조건 만족시 인자로 받은 MovedPosition 배열의 데이터 변경
return movedPosition;
}
now = movedPosition(now,'E',5);
위의 코드에서 눈여겨 봐야 할 점은 movedposition, position, now는 같은 주소를 가리키게 됩니다.명시하는 이름만 달라진 것이죠. 따라서 movedPosition 배열을 조작 하면 now는 이미 변해있기 때문에
now = movedPosition(now,'E',5); 는 무의미한 코드 입니다.
public static void movePosition(int[] position, char para_direction, int para_distance) {
//position 배열 조작
}