유클리드 호제법(Euclidean algorithm)은 최대공약수, 최소공배수를 구하는 가장 대중적인 알고리즘으로
호제법이란 두 수가 서로 상대방 수를 나누어서 결국 원하는 수를 얻는 알고리즘을 말한다.
2개의 자연수 a,b에 대해서 a를 b로 나눈 나머지를 r이라고 한다면 (단, a>b)
a와 b의 최대공야수는 b와 r의 최대공약수와 같다.
이 성질에 따라, b를 r로 나눈 나머지 r’를 구하고, 다시 r을 r’로 나눈 나머지를 구하는 과정을 반복하여 나머지가 0이 되었을 때 나누는 수가 a와 b의 최대공약수이다.
이해하기 쉽게 예를 들어 108과 78의 최대공약수를 구해보면 아래와 같은 연산을 할 수 있다.
108 % 78 = 30 // 큰수를 작은수로 나누고 나머지를 구하기
78 % 30 = 18 // 위에서 나눈수(78)를 가져와 위의 나머지로 다시 나눠서 나머지 구하기
30 % 18 = 12 // 반복
18 % 12 = 6
12 % 6 = 0 // 나머지가 0이 되면 이때 나눈 수가 최대공약수(=6)
그렇다면 최소공배수는 어떻게 구할까?
최소공배수의 규칙에서 두 수 a,b가 있을 때 a * b = 최대공약수 * 최소공배수 라는 공식이 성립한다.
내용은 기초적인 부분이지만 막상 면접 전에 한번이라도 정리하지 않으면 용어가 바로바로 안나오는 경우도 많기 때문에 간단하게나마 정리해 보았다.
OOP란
객체지향 프로그래밍(Object-Oriented Programming, OOP)은 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하는 것 입니다. 각각의 객체는 메시지를 주고받고, 데이터를 처리할 수 있으며 대표적인 특징으로 추상화, 상속, 캡슐화, 다형성이 있습니다.
직렬화(serialization)란?
객체 또는 데이터를 스트림을 통해 입출력하려면 바이트(byte)형태로 변환하는 것이 필요한데, 이를 직렬화 라고 합니다. 반대로 스트림을 통해 받은 직렬화된 객체를 원래 모양으로 만드는 과정을 역직렬화라고 합니다.
박싱과 언박싱이란?
기본 자료형(Primitive data type)을 Wrapper class로 바꾸어 주는 것을 박싱, **Wrapper class를 기본 자료형(Primitive data type)**으로 바꿔주는 것을 언박싱 이라고 합니다.
Static에 대해서
static 키워드를 쓰면 객체를 생성하지 않아도 static 변수나 static 함수를 사용할 수 있습니다.
인스턴스를 생성하면 각 인스턴스는 서로 독립적이기 때문에 서로 다른 값을 유지합니다.
각 인스턴스들이 공통적으로 같은 값이 유지되어야 하는 경우 static을 붙입니다.
static 이 붙은 메서드 에서는 인스턴스 변수를 사용할 수 없습니다.
메서드 내에서 인스턴스 변수를 쓰지 않는다면 가능하면 static을 붙이는게 호출 시간이 짧아지기 때문에 효율이 높아집니다.
클래스 설계시 static 사용 지침
클래스의 멤버변수 중 모든 인스턴스에 공통된 값을 유지해야 하는 것이 있으면 static 을 사용합니다.
메서드 중에서 인스턴스 변수를 사용하지 않는 메서드는 static 을 사용하는 것을 고려합니다.
접근 제어자에 대해서
public : 어디서든 접근 가능
protected : 동일 패키지 혹은 상속받은 외부 패키지 클래스에서 사용
(default) : 동일 패키지 내에서만 접근 가능
private : 해당 클래스 내에서만 접근 가능
String vs StringBuffer vs StringBuilder
String
immutable(불변)
객체를 한 번 할당할시 메모리 공간에 변동이 없습니다.
동기화를 신경쓰지 않아도 됩니다.
엄청나게 많은 문자열을 선언 및 연산할 시 성능저하를 고려해야합니다.
StringBuffer
mutable(가변)
멀티스레드 환경에서도 동기화를 지원(Thread-safe)
StringBuilder
mutable(가변)
동기화를 지원하지 않습니다.
정리하면 적은 양의 문자열의 선언 후 연산이 필요없다면 String을 사용하고 문자열의 선언이 많이 필요하거나 연산이 필요한데 싱글스레드 환경이라면 StringBuilder를, 멀티스레드 환경이라면 StringBuffer를 사용합니다.
Java8 특징은?
java에 함수형 프로그래밍이 처음으로 도입된 버전으로 새로 도입된 주요 기능으론Lamda 표현식, Stream API, Optional Class 같은 게 있습니다.
람다(Lamda) 표현식
익명함수로 이름과 식별자가 없는 함수를 말합니다. 불필요한 코드를 줄이고 가독성을 향상시키기 위함입니다.