문자열 my_string이 매개변수로 주어집니다. my_string을 거꾸로 뒤집은 문자열을 return하도록 solution 함수를 완성해주세요.
코딩테스트는 백준, 프로그래머스처럼 웹에서 테스트 실행 환경이 갖춰진 곳에서 할 가능성이 있기 때문에, Main.java와 Solution.java 파일을 분리 할 필요가 없었다. 따라서 이제 한 장짜리 Solution 클래스에서 메인 메서드를 작성하는 식으로 진행해야 겠다.
보통 처음 주어지는 코드는 다음과 같고, 실행부인 메인 메서드가 구성안되어있다. 이전에 객체를 생성해서 하던것처럼 구성하기 위해 public static void main(String[] args){} 메인 메소드를 작성해주어야 한다.
class Solution {
public String solution(String my_string) {
String answer = "";
return answer;
}
}
Java
복사
아래 처럼 구성했다.
class Solution {
String my_string = "REVERSE TEST"; // 인스턴스 변수
public String solution() {
StringBuffer sb = new StringBuffer(my_string);
String answer = "";
answer = sb.reverse().toString();
return answer;
}
//코테 작성 부분에서 메인이 없을 수 있다. 메인 작성해주자!
public static void main(String[] args) {
Solution solution = new Solution(); // Solution 클래스의 인스턴스 생성
String result = solution.solution(); // 인스턴스 메서드 호출
System.out.println(result);
}
}
Java
복사
StringBuffer는 처음 써봤다. 왜 일까?? 문자열을 뒤집을 일이 별로 없었기 때문에 배웠었어도 흘려듣고 잊혀진것 같다. BufferedReader 같은것은 Scanner와 비슷한 기능을 구현할 때 사용한 것으로 기억나는데 문자열을 처리하는 StringBuffer 클래스가 있는지 기억이 안났다. 최초엔 나는 문자열을 배열로 보고 for loop로 돌려서 추출해서 하나씩 다시 배치하려고 했다. 아무리 그래도 String을 처리 할 만한 클래스가 분명히 있을거라 생각했는데 String Class에서는 찾을 수 없었다. 검색을 활용해서 이런 경우 StringBuffer가 자주 사용되는 것을 확인했다. 그 중 reverse()라는 메소드로 원하는 문자열 뒤집기가 가능했다.
하지만 여기서 또 의문이 생겼던 것은 static(정적) 메소드 로 표현해야 되는가? 라는 의문이었다. 계속해서 Main.java와 Solution.java파일을 분리해서 객체를 생성하고 객체로부터 메소드를 불러왔기 때문에 한파일에서 작업하는 것이 낯설었는데 두개를 비교해보니 어떤 것이 효율적인것인지 올바른?(좋은)코드인지 구분이 안됐다. 물론 단순한 기능이기 때문에 크게 상관 없을 수도 있지만, 근본적으로 인스턴스(객체) 메소드, 정적 메소드 둘 중 어떤 쪽으로 사용해야되는지에 대한 궁금증이다.
class Solution {
static String my_string = "REVERSE TEST";
public static String solution(String my_string) {
//StringBuffer 클래스의 reverse() 메소드를 사용 해보자.
StringBuffer sb = new StringBuffer(my_string);
String answer = "";
answer = sb.reverse().toString();
return answer;
}
public static void main(String[] args) {
//Solution solution = new Solution();
//클래스 메소드(Static Method) 기 때문에
//객체를 생성 안해도 메소드를 호출 할 수 있다.
String result = solution(my_string);
System.out.println(result);
}
}
Java
복사
두 코드에 대한 효율성, 장-단점을 알아 보기 위해 ChatGPT 선생님에게 물어봤다.
GPT의 답변은 정적 메소드(static) VS 인스턴스 메소드(객체) 메소드를 비교해주었지만 목적에 따라 다르다고 했다.
그럼 그 목적은 어떤것들이 있고 장-단점은 무엇인가?
주요 포인트는 가독성 VS 유연성 + 확장성이었다.
Static(정적) 메소드로 구성한 경우 가독성이 뛰어나다. 왜냐하면 객체를 생성하지 않고 메소드를 직접 부르기 때문에(원페이지 코딩, 코드 중복 없는편) 궂이 단순한 메소드를 객체를 통해서 얻어 올 필요가 없다. 하지만 확장하거나 하면서 기능이 많아질 수록 구분하기 어려워질 가능성이 있다.
Instance(객체) 메소드로 구성한 경우 유연성, 확장성에서 유리할 것으로 보여진다. 왜냐하면 필수 로직은 그대로 두면서 메소드 또는 클래스에서의 속성을 활용하여 다른 메소드를 변경 하거나 추가 할 수 있기 때문이다.
따라서 나의 목적은 현재 코딩 테스트용이긴 하지만 주 목적은 객체 생성을 통한 문법을 작성하는 것에 익숙해지고 싶은 목적도 있다. 단일 기능일 것이기 때문에 인스턴스 메소드를 사용한다고 해서 객체를 생성하는 부분 또한 크게 복잡해지는 코드 구성은 아닐것이라는 생각이다. 처음 코드 처럼 객체를 생성하고 객체로부터 이용하는 연습을 꾸준히 하는 것도 괜찮지 않을까 생각이 된다.
•
인스턴스 메소드
◦
인스턴스 생성 후, '참조 변수.메소드 명()'으로 호출한다.
◦
인스턴스 멤버와 관련된 작업을 한다.
◦
메소드 내에서 인스턴스 변수를 사용할 수 있다.
◦
인스턴스 변수를 이용해서 작업을 하므로 변수의 묶음인 객체를 생성해야 인스턴스 메소드를 호출할 수 있다.
ex) Exam ex = new Exam(); ex.example = "예시";
Plain Text
복사
•
static 메소드(클래스 메소드)
◦
객체 생성 없이 '클래스 명.메소드 명()'으로 호출이 가능하다.
◦
인스턴스 멤버와 관련되지 않은 작업을 한다.
◦
메소드 내에서 인스턴스 변수를 사용할 수 없다.
◦
인스턴스 메소드와 달리 인스턴스 변수가 필요 없으므로 객체를 생성하지 않고도 호출할 수 있다.
ex) Math.random()
Plain Text
복사