본문 바로가기

development/Codestates

22.12.27 객체지향 프로그래밍 기초-1

오늘은 JAVA OOP 관련 기초공부를 했다.
며칠간 페어프로그래밍으로 연습문제를 풀다가 혼자가 되서 추상적인 개념을 공부하려니까 뭔가 집중이 잘 안됬었다.  딱 처음 객체의 설명을 보고 느낀건데 그냥 변수에서 목표하는 기능이 다르다고 이름을 살짝 바꾼 느낌이다. c언어에서의 변수,함수 역할을 하는 것들은 JAVA에서는 필드, 메서드라고 부르면서, 초기화하는 역할을 하는 생성자가 추가적으로 있었다. 속성이 다르긴 하지만 중요한건 객체지향 프로그래밍이라는 패러다임인것 같다.


조금 검색해 보고 느낀 결론은, 객체지향 프로그래밍은 기존 절차지향 프로그래밍의 한계점을 극복하기 위해 도입된 개념이라는 것이다. 절차지향 언어는 프로그래밍시 순차적으로 처리되며 유기적으로 동작하는데 반해 객체지향에서는 부분 부분이 따로 동작하도록 설계되어 처리속도가 느리고 설계시 조금 귀찮지만 코드의 재활용성이 높고 수정이 용이하도록 설계되었고ㅡ 특히 C언어에서는 같은 이름의 함수를 여러개 사용할 수 없지만, JAVA에서는 오버로딩을 지원해서 같은 이름의 메서드도 중복해서 사용할 수 있도록 설계되어 있었다. (호출시 메서드명뿐만 아니라 매개변수 정보까지 참조) 

클래스 변수, 인스턴스 변수, 그리고 지역변수.. 그냥 사용범위 및 호출가능 범위에 따라 이름 붙인것으로 이해했고, 인스턴스 메서드, 스테틱 메서드 또한 이하동문. static은 익숙한 느낌이다.

다만 그림처럼 생성 시점 및 공간에 차이가 있어서 유효 범위가 달라 호출시 주의가 필요한 부분이 있다.

저장 공간 관련해서앞으로 코딩하면서 부딫혀봐야 알 것 같다.
- - -

그리고 밤에 추가적으로 페어인 재영님와 함께 1시간동안 한두문제만 가볍게 풀려는 생각으로 JAVA로 프로그래머스에서 문제를 하나 풀면서 공부를 했는데, 예상치 못한 문제에 부딫혀 두시간동안 해맸다 ㅠㅠ

import java.util.Arrays;

class Solution {
    public int solution(String t, String p) {
        int answer = 0;
        int tlength = t.length();
        int plength = p.length();
        String comp = "0";
        int pint = Integer.parseInt(p);
        char[] arr = t.toCharArray();

        for(int i= 0; i <= tlength - plength; i++){
            comp = "0";
            for(int j = i; j < plength+i; j++){
                comp += arr[j];
            }
            if (Integer.parseInt(comp) <= pint){
                answer += 1;
            }

        }
        return answer;
    }
}

초기 코드

 

초기에 한시간동안 삽질해서 짰던 코드는 이런 형태로, 애를 먹었지만 해결했던 것을 정리하자면
1. String 형태로 오는 숫자의 크기를 int형식의 숫자와 비교하는 부분

 -검색으로 String형태를 int형태로 바꿔주는 메서드 Integer.parseInt("str")를 찾아서 해결
2. for문으로 한개씩 들어오는 String형태의 숫자를 p길이만큼 이어붙이기
  - toCharArray()로 char타입의 배열에 집어넣어 하나씩 더해주는 것으로 해결


위 사항들을 해결한 후에 테스트 코드를 돌리니 잘 작동해서, 제출을 눌렀는데..


런타임 에러로 실패가 떴다..
잘 되는데 시간초과 된걸로 판단하고, 어떻게 하면 더 빠르게 동작할 수 있을까 하다가 2시간이 훌쩍 지나가서 결국 다른 분들이 푼 코드를 검색해서 풀게 되었다...

 


근데,  그냥 잘 되는데 시간초과가 된 게 아니었다. 
1. int형식을 벗어나는 범위

- long형태를 사용해서 해결

 (위 초기코드에서 pint를 Long형으로, Integer.parseInt를 Long.parseLong으로 바꾸면 테스트를 모두 통과한다)

 

그냥 해결하지 못했던 문제가 있었던 것이다.. 글쓰면서 다시 살펴보며 깨닫게 된 건데, 괜히 블로그 글 쓰라고 추천하는게 아닌 것 같다.

int len = p.length();
		long num = Long.parseLong(p);
		int result = 0;

		for (int i = 0; i < t.length() - len + 1; i++) {
			long diff = Long.parseLong(t.substring(i, i + len));
			if (diff <= num) result++;
		}
		return result;

2시간동안 효율적인 코드를 짜려고 머리 싸매다가 결국 검색하니까 보이는 것은 위 코드.
str.substring()매서드로 이중 for문을 쓰지 않고 문자열을 간편하게 잘라 해결한 코드다.
substring("시작 위치", "종료 위치") or substring("시작 위치")


자바 메서드는 어떤 것이 있는지 좀 많이 공부해야 할 것 같다