SWEA에서 모의 역량테스트 문제 풀어보다가 신기한?흥미로운? 문제를 발견해서 적어보려고한다. 또, 내가 푼 방법은 다른사람들이 주로 푼 방법과는 달라서 두가지 방법을 모두 정리해보려한다. 문제 https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWXRJ8EKe48DFAUo&categoryId=AWXRJ8EKe48DFAUo&categoryType=CODE&problemTitle=%EB%AA%A8%EC%9D%98&orderBy=FIRST_REG_DATETIME&selectCodeLang=ALL&select-1=&pageSize=10&pageIndex=1 SW Expert Academy SW 프로그래밍 역량 강화에 도움이..
오랜만에 자료구조를 직접 구현해보는 연습을 해보고있다. 스택은 자주 사용하는 자료구조이며, 어느정도 개념도 잘 알고 있다보니 직접 구현하는 게 어렵진 않았다. 그래서 나 스스로에게 미션(?)을 부여하면서 구현해보았다. 첫번째는, 제네릭을 사용해서 구현할 것. 두번째는, 스택의 구성은 배열과 링크드리스트 두가지 버젼을 구현해볼것. 이를 구현하기 위해서 인터페이스를 사용했다. 보통 스택에서 사용하는 메소드들을 인터페이스를 통해 선언해놓고 배열 스택과 링크드리스트 스택에서 구현하도록 했다. 역시 이때 요소의 타입은 제네릭을 사용하여 지정하도록 하였다. Stack public interface Stack { boolean add(E data); E pop(); E peek(); E get(int idx); bo..
애노테이션? 애노테이션(annotation)은 사전적 의미로는 주석을 의미한다. 그렇지만 우리가 원래 알던 일반적인 주석 //이나 /**/와는 다르다. 일반적인 주석과 다르게 애노테이션은 코드를 작성할 수 있다. 즉, 프로그램의 소스코드 안에 다른 프로그램을 위한 정보를 미리 약속된 형식으로 포함시킨 것이 애노테이션이다. 애노테이션은 주석이기 때문에 다이나믹하게 실행되는 코드는 들어가지 않는다. 즉, 런타임 중에 알아내야하는 값은 못들어간다. 컴파일러 수준에서 해석이 되거나, 완전히 정적이어야한다. 동적으로 런타임중에 바뀌어야하는 것들은 애노테이션에 사용할 수 없다. @RestController public HelloController{ private static final String hello = "..
1. Thread 클래스와 Runnable 인터페이스 프로세스(Process) 프로세스는 단순히 실행 중인 프로그램을 말한다. 프로그램을 실행하면 운영체제에 의해 메모리 공간을 할당받아 프로세스가 된다. 프로세스는 프로그램을 수행하는 데 필요한 데이터와 메모리 등의 자원과 쓰레드로 구성되어 있다. 쓰레드(Thread) 쓰레드는 프로세스의 자원을 이용해서 실제로 작업을 수행하는 주체를 말한다. 모든 프로세스는 최소한 하나 이상의 쓰레드가 존재한다. 쓰레드가 하나면 싱글쓰레드 프로세스, 둘 이상의 쓰레드를 가진 프로세스를 멀티쓰레드 프로세스(multi-threaded process)라고 한다. 멀티 태스킹(multi-tasking, 다중작업) 여러 개의 프로세스가 동시에 실행될 수 있는 것을 말하며, 대부분..
자바 프로그램을 사용하다가 프로그램이 비정상적으로 종료될 때가 있다. 이런 원인을 에러(Error)라고 한다. 에러는 컴파일 에러와 런타임 에러로 구분할 수 있다. 컴파일 에러는 컴파일 과정에서 발생하는 에러, 런타임 에러는 실행(런타임) 과정에서 발생하는 에러를 말한다. 컴파일 에러는 기본적으로 자바 컴파일러가 문법 검사를 통해 에러를 잡아내주기 때문에 , 그 에러를 수정하면 프로그램을 실행할 수 있다. 런타임 에러는 컴파일 시에 에러가 발생하지 않더라도 실행(런타임) 과정에서 에러가 발생하는 것을 말한다. 런타임 에러를 막기 위해서는 프로그램 실행 과정에서 일어날 수 있는 에러의 경우의 수를 모두 고려해 방지해야 한다. 자바에서 런타임 에러를 에러(Error)와 예외(Exception) 두가지로 구분..
인터페이스란? 인터페이스는 객체와 객체 사이에서 상호작용의 매개로 쓰이는데, 일종의 추상클래스이다. 그러나 추상클래스보다 추상화 정도가 높아서 일반 메소드나 멤버변수를 구성원으로 가질 수 없다. 추상 메소드와 상수만 구성원으로 가질 수 있다. ( ⚠ 자바 8 이후부터는 default 일반 메소드 와 static 메소드를 구현할 수 있다.) 1. 인터페이스 정의 인터페이스의 선언은 예약어로 class가 아닌 interface 키워드를 사용한다. 접근 제어자는 public 이나 default를 사용한다. public interface 인터페이스명 { //1) 변수(상수) 타입 상수명 = 값; //2) 추상 메소드 타입 메소드명(매개변수, ...); // 디폴트 메소드 default 타입 메소드명(매개변수, ..
1. package 키워드 패키지는 사용자가 만든 클래스나 인터페이스 등을 모은 단위를 말한다. 모든 클래스는 정의된 클래스 이름과 패키지 이름이 있다. 이 둘을 합쳐야 완전한 한 클래스를 표현한다고 하며 이것을 FQCN(Fully Qualified Class) 라고 한다. 예를 들어 String 클래스의 패키지는 java.lang 이고 FQCN은 java.lang.String이 된다. 쉽게 말하면, 패키지는 클래스를 구분짓는 폴더 개념이다. 그래서 패키지 이름과 위치한 폴더의 이름이 같아야 한다. 패키지 이름은 모두 소문자여야 하고, 자바의 예약어를 사용하면 안된다. 패키지명은 클래스의 파일 상단에 작성한다. 아래 클래스의 FQCN은 com.pudding.study.ExmapleClass 이 된다. p..
1. 상속이란? 상속은 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것을 말한다. 여기서 기존의 클래스는 부모 클래스(=상위 클래스 = 슈퍼 클래스)이고, 새로운 클래스는 자식 클래스(=하위 클래스 = 서브 클래스)라고 한다. 자식 클래스는 부모 클래스의 변수와 메서드를 재사용 할 수 있다. 상속을 통해서 새로운 클래스를 작성하면 코드를 공통적으로 관리할 수 있어서 코드를 추가하거나 변경하는 것에 매우 용이하다. 이는 객체지향 프로그래밍(OOP)의 주요 개념이다. 자바에서 상속을 구현하는 방법은 다음과 같다. 새로운 클래스의 이름 뒤에 키워드 'extends'와 상속받고자 하는 클래스의 이름을 적으면 된다. //class 자식클래스명 extens 부모클래스명 { } class Child exten..