내배캠 사전캠프 TIL 18일차

오병택·2025년 2월 11일

내배캠

목록 보기
18/73

학습 요약

자바 강의, 코테 문제

코테

프로그래머스 level1 - 두 개 뽑아서 더하기

문제 설명
정수 배열 numbers가 주어집니다. numbers에서 서로 다른 인덱스에 있는 두 개의 수를 뽑아 더해서 만들 수 있는 모든 수를 배열에 오름차순으로 담아 return 하도록 solution 함수를 완성해주세요.

import java.util.ArrayList;
class Solution {
    public int[] solution(int[] numbers) {
        int[] answer = {};
        ArrayList <Integer> al= new ArrayList<>();
        for (int i=0; i<numbers.length-1; i++) {
            for (int j=i+1; j<numbers.length; j++) {
                 al.add(numbers[i]+numbers[j]);
            }
        }
        answer=al.stream().sorted().distinct().mapToInt(Integer::intValue).toArray();
        return answer;
    }
}

스트림을 언젠간 써서 풀어보고 싶었는데 뭔가 각이 보여서 써서 풀었다. 확실히 엄청 빠르게 풀린다. 스트림이 익숙치 않아서 더 어려웠다면 이렇게 못 풀었을 수도..

프로그래머스 level1 - 숫자 문자열과 영단어

문제 설명
다음은 숫자의 일부 자릿수를 영단어로 바꾸는 예시입니다.
1478 → "one4seveneight"
234567 → "23four5six7"
10203 → "1zerotwozero3"
이렇게 숫자의 일부 자릿수가 영단어로 바뀌어졌거나, 혹은 바뀌지 않고 그대로인 문자열 s가 매개변수로 주어집니다. s가 의미하는 원래 숫자를 return 하도록 solution 함수를 완성해주세요.

import java.util.*;
class Solution {
    public int solution(String s) {
        int answer = 0;
        Map <String,Integer> map = Map.of(
        "zero",0,"one", 1,"two",2,"three",3,"four",4,"five",5,"six",6,"seven",7,"eight",8 ,"nine",9
        );
        String s1 = s;
        for (String map1: map.keySet()) {
            if (s.contains(map1)){
                s1=s1.replace(map1,String.valueOf(map.get(map1)));    
            }
        }
        answer=Integer.parseInt(s1);
        
        return answer;
    }
}

Map <k,v> map = new HashMap<>(); // 맵 객체 생성 및 선언
Map.of // 불변 Map 생성
Map<k,v>: 인터페이스이며, Key-Value(키-값) 쌍을 저장하는 자료구조

Map 종류별 특징

Map의 주요 기능

Map을 쓰면 풀기 쉽겠다라고 생각은 했지만 사용법을 잘 몰라서 오래 걸렸다.

JAVA 강의

인터페이스는 추상 클래스의 특수형태이며, 둘의 차이는 목적

추상 클래스의 목적: 기본적으로 클래스이며, 상속, 확장하여 사용하기 위해 사용

인터페이스의 목적: 해당 인터페이스를 구현한 객체들에 대한 동일한 사용방법과
동작을 보장하기 위해 사용

적절한 사용 방법:

추상 클래스
-관련성이 있는 클래스에서 공통 부분을 이용하려는 경우
-공통으로 가지는 메서드와 필드가 많거나, public 이외의 접근자 선언이 필요한 경우
-non-static, non-final 필드 선언이 필요한 경우(각 인스턴스에서 상태 변경을 위한
메서드가 필요할 경우)

인터페이스
-관련성이 없는 클래스에서 공통 부분을 이용하려는 경우
-특정 데이터 타입의 행동을 명시하고 싶은데, 어디서 그 행동이 구현되는지 신경
쓰지 않는 경우
-다중상속을 허용하고 싶은 경우

내부 클래스의 종류와 특징


위의 사진과 같이 iv, cv, lv와 같은 개념

내부 클래스 이해하기 위해 알아두면 좋은 예제1

class Outer {
	private int outerIv = 0;
	static  int outerCv = 0;

	class InstanceInner {
		int iiv  = outerIv;  // 외부 클래스의 private멤버도 접근가능하다.
		int iiv2 = outerCv;
	}

	static class StaticInner {
// 스태틱 클래스는 외부 클래스의 인스턴스멤버에 접근할 수 없다.
//		int siv = outerIv;
		static int scv = outerCv;
	}

	void myMethod() {
		int lv = 0;
		final int LV = 0;  // JDK1.8부터 final 생략 가능

		class LocalInner {
			int liv  = outerIv;
			int liv2 = outerCv;
//	외부 클래스의 지역변수는 final이 붙은 변수(상수)만 접근가능하다.
//			int liv3 = lv;	// 에러!!!(JDK1.8부터 에러 아님)
			int liv4 = LV;	// OK
		}
	}
}

지역변수가 지역이너클래스보다 빨리 끝날 수 있으므로 외부 클래스의 lv를 쓰면
에러 발생하지만 1.8부턴 값이 변경되지 않으면 상수 취급해서 final을 생략 가능

예제2

class Outer2 {
	class InstanceInner {
		int iv = 100;
	}

	static class StaticInner {
		int iv = 200;
		static int cv = 300;
	}

	void myMethod() {
		class LocalInner {
			int iv = 400;
		}
	}
}
class Ex7_15 {
	public static void main(String[] args) {
		// 인스턴스클래스의 인스턴스를 생성하려면
		// 외부 클래스의 인스턴스를 먼저 생성해야 한다.
		Outer2 oc = new Outer2();
		Outer2.InstanceInner ii = oc.new InstanceInner();

		System.out.println("ii.iv : "+ ii.iv);
		System.out.println("Outer2.StaticInner.cv : "+Outer2.StaticInner.cv);
                                     
	   // 스태틱 내부 클래스의 인스턴스는 외부 클래스를 먼저 생성하지 않아도 된다.
		Outer2.StaticInner si = new Outer2.StaticInner();
		System.out.println("si.iv : "+ si.iv);
	}
} 

외부 클래스의 iv와 내부 이너 클래스의 iv와 lv 구별하는 예제

class Outer3 {
	int value = 10;	// Outer3.this.value

	class Inner {
		int value = 20;   // this.value

		void method1() {
			int value = 30;
			System.out.println("            value :" + value); // 내부 클래스 lv
			System.out.println("       this.value :" + this.value); // 내부 클래스 iv
			System.out.println("Outer3.this.value :" + Outer3.this.value); // 외부 클래스 iv
		}
	} 
} 

class Ex7_16 {
	public static void main(String args[]) {
		Outer3 outer = new Outer3();
		Outer3.Inner inner = outer.new Inner();
		inner.method1();
	}
}

프로그램 오류:

-컴파일 에러: 컴파일할 때 발생하는 에러
-런타임 에러: 실행할 때 발생하는 에러
-논리적 에러: 작성 의도와 다르게 동작

java의 런타임 에러

-에러(error): 프로그램 코드에 의해서 수습될 수 없는 심각한 오류
-예외(exception): 프로그램 코드에 의해서 수습될 수 있는 다소 미약한 오류

예외처리의 정의와 목적

정의: 프로그램 실행 시 발생할 수 있는 예외의 발생에 대비한 코드를 작성하는 것
목적: 프로그램의 비정상 종료를 막고, 정상적인 실행 상태를 유지하는 것

Exception클래스+자손 클래스들: 사용자의 실수와 같은 외적인 요인에 의해 발생하는
예외
RuntimeException클래스+자손 클래스들: 프로그래머의 실수로 발생하는 예외

try-catch문 구조

try {
    // 예외가 발생할 가능성이 있는 코드
} catch (ExceptionType1 e1) {
    // 예외가 발생했을 때 실행할 코드
}catch (ExceptionType2 e2) {
    // 예외가 발생했을 때 실행할 코드
}

느낀 점

내부 클래스 부분은 코드가 길어서 지저분해 보일 수도 있지만 글로 설명하면 다시 봤을 때 이해가 잘 안 될 것 같아서 어쩔 수 없다. 그리고 공부 시간을 늘리고 있는데 확실히 12시간은 좀 피곤하다.. 나 화이팅!

profile
걱정하지 말고 일단 해봐!

0개의 댓글