java

· Kotlin
Data & Nested classes 자바에서 데이터만 보유하는 클래스를 만들려면 여러 가지 정의해야 하는 경우가 있다 코틀린은 Data클래스를 지원하여 이러한 상황에서 보다 손쉽게 구현할 수 있다. data class User(val name: String, val age: Int) 기본 생성자에서 선언된 속성을 톻애 equals(), toString() 등의 여러 함수들을 자동으로 생성해준다. 물론 명시적으로 정의할 수도 있다. 기본 생성자에서 1개 이상의 프로퍼티가 있을 경우에 의미가 있으며, abstract, open, sealed, inner가 안된다. 하지만 1.1이후로는 sealed class를 상속할 수 있게 되었다. 만약 Data class에 아무런 프로퍼티를 주지 않고 생성하고 싶을 ..
· Kotlin
Properties & Field 자바에서는 프로퍼티를 지원하지 않는다. 따라서 getter나 setter를 만들어서 변수에 접근해야 했다. 하지만 코틀린에서는 프로퍼티를 지원하기 때문에 getter나 setter를 만들지 않아도 된다. class Address{ var name: String = "Kotlin" val city: String = "Seoul" } fun copyAddress(address: Address): Address{ val result = Address() result.name = address.name return result } 사실 프로퍼티는 getter와 setter가 있지만 생략 가능하다. public static final void main() { Address obj..
· Kotlin
Inheritance 객체지향적인 언어의 장점 중 하나는 바로 상속이다. 코틀린에서의 상속을 알아보자. 코틀린의 최상의 클래스는 Any이다. 클래스에 상위 타입을 선언하지 않으면 Any가 상속된다. class Ex1 //암시적 Any상속 class Ex2: Any() //명시적 Any상속 Any는 java에서 Object와 비슷해 보이지만 조금 다르다. equals(), hashCode(), toString()만 존재한다. 상속을 해줄 클래스가 open을 해줘야 상속이 가능하다. 또한 부모 클래스에 기본 생성자가 있다면 호출하여 초기화 가능하다. 코틀린에서 클래스는 기본적으로 final이다. 따라서 상속을 원한다면 open을 반드시 적어야 한다. open class parent(firstName: Str..
· Kotlin
class 코틀린에서 class를 선언할 때는 자바와 마찬가지로 class라는 키워드로 선언한다. class Invoice(data: Int){ } 헤더와 바디는 옵션이다. 바디가 없다면 { }도 생략 가능하다. 기본 생성자 자바와는 달리 생성자가 여러 개로 나뉜다. 우선 기본 생성자는 클래스별로 없거나 단 하나만 존재한다. class Person constructor(firstName: String){ } 어노테이션이나 접근 지정자가 없을 때는 기본 생성자의 construcor 키워드를 생략할 수 있다. 기본 생성자는 코드를 가질 수 있다. 초기화는 init 블록 안에서 작성해야 한다. class Customer(name: String){ init{ println("Customer initalized ..
· Kotlin
Packages 소스 파일은 패키지 선언으로 시작된다. 만약 패키지를 선언하지 않는다면 기본 패키지에 포함된다. 모든 컨텐트는 패키지에 포함된다. 다른 파일이나 소스에서 호출을 하려면 패키지를 import 해야 한다. 기본 패키기 기본으로 import가 되는 package가 있다. JVM에서 실행을 한다면 java.lang.*나 kotlin.jvm.* 등이 자동으로 import 된다. Return and Jumps 3개지 jump표현식이 있다. return: 함수나 익명 함수에서 반환 break: 루프를 종료 continue: 루프의 다음 단계로 진행 kotiln에서는 label로 break and continue가 가능하다. label@, abc@, fooBak@등과 같이 레이블을 달아 그 부분으로 분..
· Kotlin
Basic Types 코틀린에서 모든 것은 객체이다. 모든 것에 멤버 함수나 프로퍼티를 호출 가능하다. 숫자 Java의 숫자형과 거의 비슷하다. 하지만 Java에서 숫자형이던 char가 kotlin에서는 숫자 형이 아니다. Double: 64bit Float: 32bit Long: 64bit Int: 32bit Short: 16bit 리터럴 underscore를 사용하여 리터럴을 표현할 수 있다. val oneMillion = 1_000_000 val creditCardNumber = 1234_5678_1234_5678 긴 숫자들을 헷갈리지 않고 사용할 수 있을 것 같다. Representation Java 플랫폼에서 숫자형은 JVM primitive type으로 저장된다. Nullable이나 제네릭의 ..
정답 비율이 40%라 도전해봤는데 문제가 짧아서 당황했다. 문제를 읽어보니 문제 제목과 똑같이 입력받은 수로 어떠한 수를 나누었을 때 몫과 나머지가 같은 수들의 합을 구하면 되는 간단한 문제였다. 이런 문제 정답 비율이 왜 이렇게 낮을까 생각하고 문제 풀이를 시작했다. 입력받은 수를 n이라 했을 때 어떠한 수를 나누는 상황에서 나머지가 생기는 경우는 n-1가지의 경우이다. ( 나머지는 나누는 수 보다 무조건 작고, 1~n-1까지의 수이다. ) 이러한 원리로 1부터 n-1까지 어떠한 수의 몫과 나머지가 같은 수를 만들어 더해주면 될 거라 생각했다. 아래는 처음에 작성한 Java 코드이다. import java.util.Scanner; public class SameMod { public static voi..
초등학교 수학 문제에서 많이 봤던 문제이다. 낮에 이동하고 밤에 미끄러지기 때문에 낮에 이동했을 때 목표 거리와 비교한 뒤 만족하지 않았다면 미끄러진 높이를 계산하는 계산을 반복하면 되는 문제라고 생각했다. 하지만 결과는 시간 초과... 그래서 다음엔 배열을 이용해 봤다. 배열일 연산이 제일 빠르기 때문에 시간 초과 문제를 해결할 거라 생각했다. 낮에 이동한 거리의 배열과 미끄러진 후의 거리 배열을 생성하여 낮에 이동한 거리가 목표 높이에 도달하기까지 반복하여 index를 출력하면 될 줄 알았다. 하지만 이번에는 메모리 초과.... 한참 고민하다 해답이 떠올랐다. 결국 마지막에는 앞으로 이동을 해야 하기 때문에, 앞으로 가는 거리를 목표 높이에서 뺀 뒤 실제로 이동하는 거리(앞 - 뒤)로 나누어 주면 정..
오랜만에 DP 문제를 풀어보았다. 정수 삼각형을 입력받아 저장한 뒤, 최종적으로 가장 큰 수를 만들어 가는 문제이다. 단, 선택할 수는 다음행의 수 중, 왼쪽, 오른쪽 둘 중 하나만 선택 가능하다. 즉, 7에서 선택할 수 있는 수는 3, 8 둘 중 하나이다. 이런 방식으로 하나씩 더해 나가 가장 큰 수를 만들면 된다. 얼핏 보면, 선택할 수 있는 수 중에 큰 수를 선택해서 진행하면 되는 탐욕 법 문제로 볼 수 있다. 하지만, 그 다음 상황은 모르기 때문에 탐욕 법은 항상 올바른 답을 주지 않는다. 따라서, 동적 계획법을 이용하여 답을 구해내면 된다. 다음은 Java로 작성한 코드이다. import java.util.Scanner; public class Triangle { public static voi..
두 수열이 주어졌을 때, 가장 긴 공통 수열을 찾아내는 문제이다. 앞서 풀었던 가장 긴 증가하는 부분 수열과 비슷하다고 생각할 수 있지만 조금 다른 문제이다. for문을 여러 번 돌려 메모제이션을 이용하여 문제를 풀려했었다. 하지만, 문자열을 계속해서 반복하고 어디까지 일치하는지를 기록해야 하고, 건너뛰는 요소가 있을 수 있기 때문에 쉽지 않았다. 해답은 2차원 배열을 이용한 메모제이션이였다. 입력받은 두 문자열 길이보다 1씩 큰 2차원 배열을 생성한 뒤, 0번째 column과 0번째 row을 0으로 초기화 한 뒤, 문제를 풀어나가면 된다. 0으로 채우는 이유는 기저 조건을 설정하는 것이다. 2중 for문을 이용하여 row와 column의 각 요소들을 비교하며 진행한다. 그러다 일치하는 요소가 발견되면,..