면접에 대비해 면접 스터디를 구성해서 4주간 CS관련 배경 지식들을 함양하기로 했다.
1주차 주제는 아래와 같다.
자바 가상 머신(Java Virtual Machine)은 OS에 구애받지 않는 플랫폼 독립성을 특징으로 하여 Java와 OS 사이에 중개자 역할을 한다.
※동적 로딩: 실행시에 모든 클래스를 로딩하지 않고 필요한 시점에 클래스를 로딩하여 사용
GC는 쓰레기 객체 정리(Garbage Collector)의 약자이다. Java Runtime시 Heap 영역에 저장되는 객체는 따로 정리하지 않으면 계속 쌓여 OutOfMemory Exception이 발생할 수 있다. 이를 방지하기 위해 JVM이 OS로부터 메모리를 할당받은 후 GC를 통해 스스로 메모리 관리를 하게 된다.
GC는 Heap영역 내에서 어떤 영역에서 수행되는지에 따라 Minor GC와 Major GC로 구분할 수 있다.
Minor GC: Young Generation 영역에서 발생하는 GC
Major GD: Old, Perm 영역에서 발생하는 GC
타입: 자료형이라고도 부르며, int, float, bool, short, 객체형 등이 있다.
변수 선언시에 앞에 붙여 사용한다.
정적 타입 언어: '정적'의 의미는 컴파일 시에 타입을 결정한다는 뜻이다. C, C#, C++, Java 등의 언어가 이에 해당한다. 변수에 들어갈 값에 따라서 타입을 지정해주어야 하는 언어들이다. 컴파일 시 미리 정보를 결정하기 때문에 속도가 빠르고 타입 에러로 인한 문제를 조기에 발견할 수 있어 안정성이 높다. 반면 타입이 미리 제한되기 때문에 유연성은 떨어진다.
동적 타입 언어: 동적 타입은 컴파일 시가 아니라 실행 시에 타입을 정하게 된다. Python, Ruby, JavaScript 등의 언어가 해당한다. 타입에 대한 결정을 Runtime까지 끌고 갈 수 있어 유연성이 있고, 상대적으로 코드 작성이 빠르다. 반면 실행 도중 변수에 예상하지 못한 타입이 들어와 에러가 발생할 수 있고, 코드가 복잡해지면 타입 에러를 찾기 어려운 측면이 있다.
타입 | 형 | 저장공간 | 범위 | 비고 |
---|---|---|---|---|
int | 정수 | 4 Byte | 2,147,483,648 ~ 2,147,483,647 (약 ±20억) | - |
long | 정수 | 8 Byte | 9,223,372,036,854,775,808 | 접미어 L 사용 |
short | 정수 | 2 Byte | 32,768 ~32,767 | - |
byte | 정수 | 1 Byte | 128 ~ 127 | - |
float | 부동 소수점 | 4 Byte | 약 +-3.40282347E+38F (자릿수 6~7) | 접미어 F 사용 |
double | 부동 소수점 | 8 Byte | 약 +-1.79769313486231579E+308 (자릿수 15) | - |
char | char | 테스트3 | - | UTF-16 문자 인코딩 |
boolean | boolean | - | True, False만 가능 | 논리 값 판단(참, 거짓) |
-참조 타입: 객체(Object)의 주소를 저장(참조)하는 타입. Array, Class, Interface 등
class OverloadingTest{
//이름이 cat인 메서드
void cat(){
System.out.println("매개변수 없음");
}
//매개변수 int형이 2개인 cat 메서드
void cat(int a, int b){
System.out.println("매개변수 :"+a+", "+b);
}
//매개변수 String형이 한 개인 cat 메서드
void cat(String c){
System.out.println("매개변수 : "+ c);
}
}
public class OverTest {
public static void main(String[] args) {
//OverloadingTest 객체 생성
OverloadingTest ot = new OverloadingTest();
//매개변수가 없는 cat() 호출
ot.cat();
//매개변수가 int형 두개인 cat() 호출
ot.cat(20, 80);
//매개변수가 String 한개인 cat() 호출
ot.cat("오버로딩 예제입니다.");
}
}
출처: https://private.tistory.com/25 [공부해서 남 주자]
class Woman{ //부모클래스
public String name;
public int age;
//info 메서드
public void info(){
System.out.println("여자의 이름은 "+name+", 나이는 "+age+"살입니다.");
}
}
class Job extends Woman{ //Woman클래스(부모클래스)를 상속받음 :
String job;
public void info() {//부모(Woman)클래스에 있는 info()메서드를 재정의
super.info();
System.out.println("여자의 직업은 "+job+"입니다.");
}
}
public class OverTest {
public static void main(String[] args) {
//Job 객체 생성
Job job = new Job();
//변수 설정
job.name = "유리";
job.age = 30;
job.job = "프로그래머";
//호출
job.info();
}
}
출처: https://private.tistory.com/25 [공부해서 남 주자]
접근 제어자란?: 클래스나 인터페이스, 그리고 이들이 가지고 있는 멤버의 접근을 제어하기 위한 지시어.
종류
①Public - 모든 패키지, 모든 클래스에서 접근 제한 없음
②Protected - 같은 패키지의 모든 클래스에 접근 허용 / 다른 패키지여도 자식 클래스라면 접근 허용
③Default - 동일한 패키지 내에 있는 클래스만 접근 허용
④Private - 해당 멤버를 선언한 클래스에서만 접근 허용
접근 제어자 | 같은 클래스의 멤버 | 같은 패키지의 멤버 | 자식 클래스의 멤버 | 그 외 영역 |
---|---|---|---|---|
Public | O | O | O | O |
Protected | O | O | O | X |
Default | O | O | X | X |
Private | O | X | X | X |
final 키워드가 선언되면 시간이 지나도 처음 정의된 상태가 변하지 않는다는 것을 보장한다는 의미이다.
①변수(variable): 변수에 final을 붙이면 이 변수는 수정할 수 없다는 의미가 된다. 수정 불가한 범위는 그 변수의 값에 한정된다. 수정될 수 없기 때문에 초기화 값이 필수적이다.
②메서드(method): 메서드에 final이 붙으면 override가 제한된다. 즉, 상속받은 클래스에서 해당 메서드를 수정해서 사용하지 못하도록 제한하는 것이다.
③클래스(class): 클래스에 final이 붙으면 다른 클래스가 상속할 수 없는 클래스가 된다.
데이터의 타입(data type)을 일반화(generalize)하는 것으로,
클래스나 메소드에서 사용할 내부 데이터 타입을 클래스 외부에서 컴파일 시에 미리 지정하는 것이다.
JDK 1.5에서 처음 도입. <> 괄호 안에 타입을 지정해 준다.
장점으로는 잘못된 타입이 들어오는 것을 컴파일 단계에서 방지할 수 있고, 클래스 외부에서 지정해주기 때문에 변환 과정이 필요 없어 관리가 편하다. 또한 비슷한 기능 지원시 코드의 재사용성이 높아진다.
타입 변수(Type Variable)의 예시
class MyArray<T> {
T element;
void setElement(T element) { this.element = element; }
T getElement() { return element; }
}
public class UserTermService {
public static ThreadLocal<Integer> threadLocalValue = new ThreadLocal<>(); // ThreadLocal 사용을 위한 선언
public UserTermService(Integer value) {
threadLocalValue.set(value); // ThreadLocal에 set 값을 세팅
}
public void threadLocal_1() {
System.out.println("threadLocalValue : " + threadLocalValue.get()); // ThreadLocal에 있는 값을 가져오기
}
}
public class ThreadLocalTest {
@Test
public void threadLocalTest() {
UserTermService userTermService = new UserTermService(5);
userTermService.threadLocal_1(); // threadLocalValue : 5 출력 확인
}
}