케이크를 n조각으로 자른 후 규칙에 따라 케이크를 먹기로 합니다. 1. 케이크는 편의를 위해서 1번 조각을 기준으로 시계방향으로 n번 조각까지 순서대로 있다고 한다. 2. 항상 1번 조각 케이크 부터 먹는다. 3. 다음 조각은 이전에 먹은 케이크 조각에서 시계 방향으로 남아있는 조각들 중 k번째에 있는 조각을 먹는다. 4. 케이크가 2조각 남으면, 먹는 것을 멈춘다. 케이크를 자른 조각의 개수 n과 k가 주어졌을 때, 마지막에 남은 케이크 조각의 번호를 출력하시오. n = 8, k = 2 : 4 8 n = 6, k = 3 : 3 5 입력형식> 8 2 출력형식> 4 8 ✍ import java.io.BufferedReader; import java.io.InputStreamReader; import jav..
개발/Java
🔍 ActionForward 포워딩 정보(포워딩 방식과 포워딩 주소)를 관리하는 클래스이며, DTO 클래스의 역할과 유사하다. package vo; public class ActionForward { // 1. 멤버변수 선언 private String path; // URL(주소) private boolean isRedirect; // 포워딩 방식(true : Redirect 방식, false : Dispatch 방식) // 2. Getter/Setter 정의 public String getPath() { return path; } public void setPath(String path) { this.path = path; } public boolean isRedirect() { return isRed..

🔍 BigInteger, BigDecimal 클래스 - java.math 패키지 - 수치데이터를 처리하는 부가적인 클래스 - 아주 큰 정수 또는 실수를 저장하거나, 실수의 문제점을 해결하는 용도로 사용한다 ✍ BigInteger 클래스 - 정수의 최대 크기(long 타입이라고 가정)는 약 922경 인데, 이보다 크거나 작은 정수는 취급이 불가능한 문제가 생긴다. 이를 해결하기위해 별도로 추가된 클래스이다. - 객체 생성 시 파라미터로 전달할 정수는 "문자열" 형태로 전달한다. - 정수 데이터를 내부적으로 int[] 타입으로 관리한다. - toString() 메서드가 오버라이딩 되어 있다. - 일반적은 산술연산자를 사용한 연산은 불가능하며 반드시 메서드를 통해 연산 한다. => add(), substrac..

🔍 스트림 - 여러 자료의 처리에 대한 기능을 구현해 놓은 클래스이다. - 배열, 컬렉션 등의 자료를 일관성있게 처리할 수 있다. ✍ 스트림의 특징 - 자료의 대상과 관계없이 동일한 연산을 수행한다. - 한번 생성하고 사용한 스트림은 재사용할 수 없다. - 스트림의 연산은 기존 자료를 변경하지 않는다. (스트림 연산을 위해 사용하는 메모리 공간이 별도로 존재하기 때문이다.) - 중간연산과 최종연산이 존재한다. => 중간연산은 여러개가 적용될 수 있고, 최종연산은 맨 마지막에 한 번 적용된다. 최종연산이 호출되지 않으면 중간연산이 아무리 많더라도 적용되지 않는다. 이를 지연연산(lazy evaluation)이라고 한다. int[] arr = {1, 2, 3, 4, 5}; for(int i=0; i 일반적인..

🔍 람다식 - 자바 8에 추가된 가장 큰 특징이다. - 자바가 "함수형" 프로그래밍 형태를 받아들인 결과이다. ✍ 함수형 프로그래밍 - 함수형: 1950년대, 객체지향: 1990년대 - 기능 위주의 프로그래밍 기법 - 객체지향: 클래스에 속성과 기능을 정의 - 함수형: 기능. 즉, 함수가 따로 존재 ✍ 함수형 프로그래밍 특징 1. 순수함수: 동일한 input에는 동일한 output이 나와야 하며 (동적바인딩) side-effect가 없는 함수를 뜻한다 (참조변수, 원본데이터 수정 x) => 외부의 상태를 변경하거나 외부의 값을 참조하지 않는다 2. 1급함수 : 함수가 매개변수로 전달 가능. 함수가 리턴이 될 수 있음. 함수를 변수에 저장 가능. ✍ 람다식 기본 문법 () -> { } (데이터타입 매개변수..
🔍 StringBuilder - 문자열이 안전하게 변경되도록 보장하지 않는다 🔍 StringBuffer - 문자열이 안전하게 변경되도록 보장한다 (멀티쓰레드 프로그램이 아니라면 StringBuilder의 속도가 빠르다)
🔍 프로그램(Program) 디스크에 설치되어 있는 실행되기 전 상태의 소프트웨어 🔍 프로세스(Process) - 프로그램을 실행하여 메모리에 로딩된 상태. 즉, 실행 중인 프로그램을 뜻한다. - 멀티테스킹(Multi Tasking) => 프로세스가 여러개일 때 해당 프로세스들이 동시해 수행되는 것을 뜻한다. 정확히는 CPU가 빠른 속도로 프로세스들을 번갈아가며 처리하는 것이다. 진짜로 동시에 수행되는 것은 아니다. 🔍 쓰레드(Thread) - 프로세스 내에서 작업의 최소 단위 - 하나의 프로세스 내에 쓰레드가 1개(=Single Thread)일 때, 해당 프로세스 내에서 동시에 수행 가능한 작업은 단 1개 뿐이다. - 하나의 프로세스 내에서 동시에 수행가능한 작업을 늘리려면 멀티 쓰레딩(Multi Th..

✍ 부모 타입에 제네릭 타입이 지정되어 있을 경우 서브클래스가 부모 클래스를 상속 받을 때, 부모의 타입 파라미터를 서브 클래스 타입 파라미터로 명시해야 한다 class Class1 {} // 부모 클래스 interface Interface1 {} // 부모 인터페이스 class Subclass extends Class1 implements Interface1 { P var1; // 슈퍼클래스 Class1의 타입 P Q var2; // 슈퍼클래스 Interface1의 타입 Q R var3; // 자신의 타입 R } => Subclass가 Class1 클래스와, Interface1을 상속받는다. Class1의 제네릭 타입은 P, Interface1의 제네릭 타입은 Q이다. 자식 클래스인 Subclass에 ..
🔍 주의사항 1. static 멤버 내에서 제네릭 타입 파라미터의 사용이 불가능하다 => 제네릭 타입은 인스턴스 생성 시점에서 데이터타입으로 변환되는데 static 키워드가 붙은 멤버는 인스턴스 생성 시점보다 먼저 로딩된다. 즉, 데이터타입이 지정되지 않은 상태이기 때문에 사용이 불가능하다! 정리하자면 static 키워드는 인스턴스 생성과 전혀 관련이 없다. 그래서 컴파일 시점에서 생성자 타입 확인이 불가능하다. 반면 제네릭 타입은 인스턴스 생성 시점에 데이터타입이 지정된다. 그렇기 때문에 제네릭 타입의 파라미터로 static 키워드를 사용할 수 없다. 2. new 연산자 사용 시 제네릭 타입 파라미터 사용이 불가능하다 3. instanceof 연산자 사용 시 제네릭 타입 파라미터 사용이 불가능하다.

🔍 제네릭 - 객체에서 사용할 데이터타입을 클래스 정의 시 미리 정의하지 않고 실제 객체 생성 시 데이터 타입을 지정하여 사용하도록 하는 기법이다. => 객체를 생성할 때마다 각각 다른 데이터 타입으로 사용이 가능하다. => 데이터 타입을 지정 할 때 반드시 참조 데이터 타입으로만 지정이 가능하다. 기본형 사용 불가 !!! ex) 는 불가능하고, 는 가능하다 - 데이터를 저장하는 시점에서 미리 저장 데이터에 대한 타입의 판별이 가능하므로, 데이터 저장시점에서 안정성을 향상시킨다. - 데이터를 꺼내는 시점에서 저장된 데이터 타입만 꺼낼 수 있다는 보장이 생기므로 별도의 판별이나 형변환 없이 해당 타입을 그래도 사용 가능하다. - 주로 Collectrion API 들은 대부분 제네릭 타입으로 클래스가 설계되..