목차 글 쓸 때마다 찾기는 싫어서 마크다운 문법은 많은데, 많이 쓰지는 않고, 그렇다고 일일이 찾아보기는 귀찮아서... 첫째, 제목(h 태그) h1, h2... 의 태그를 적용시켜준다. h1 h2 h3 h4 h5 h6 # h1 ## h2 ### h3 #### h4 ##### h5 ###### h6 둘째, BlockQuote 공식문서는 이렇던데, 그냥 부연설명느낌이다. 이런거다 이렇게 쑤면된다. > 이런거다 셋째, 목록 첫째 둘째 셋째 1. 첫째 2. 둘째 3. 셋째 쉽다 쉬워 만약 순서가 없는 목록이라면 기호 (*, -, +)를 사용한다. 첫째 둘째 셋째 첫째 둘째 셋째 첫째 둘째 셋째 * 첫째 * 둘째 * 셋째 + 첫째 + 둘째 + 셋째 - 첫째 - 둘째 - 셋째 첫째 둘째 셋째 * 첫째 - 둘째 + ..
목차 추상클래스, 인터페이스 너무도 헷갈리는 개념 둘이다. 사실 별로 크게 차이가 나지도 않긴 하지만. 일단 추상클래스가 무엇인지 알아보자. 추상클래스란 구현부가 없는 메서드가 하나 이상 있는 클래스를 추상 클래스라 한다. public class Keyboard{ private int keypressure; public abstract void Keydown(); public void turnOn(){ System.out.println(“turn On keyboard”); } } 이렇게 Keydown()메서드의 구현부가 없는 것. 이것이 추상클래스이다. 그럼 인터페이스는 무엇일까. 인터페이스는 너무 많은 의미로 쓰인다. 여기서는 객체지향 프로그래밍에서 사용하는 새로운 의미의 인터페이스 이다. 인터페이스는..
목차 생성자 객체를 인스턴스화 할 때, 초기 상태를 지정해 주기 위해서 생성자 개념을 사용한다. 각 언어마다 생성자를 지정하는 방법이 다양한데, VisualBasic 에서는 New 키워드로, Swift는 init 키워드로, Java와 C#같은 경우에는 클래스의 이름과 동일한 메서드로 생성자를 지정한다. 우리는 계속 사용해오던 Java를 사용하여 알아보록 하자. 상속 Slime 클래스의 생성자를 만들어보자. public class slime{ private int hp; private int ATK; private int DEF; public slime(){ // 반환값이 없다! this.hp = 500; this.ATK = 30; this.DEF = 10; } public void tackle() /* ..
목차 이름이 비슷비슷해서 공부할 때는 항상 헷갈렸던, 오버로딩과 오버라이딩을 설명해보겠다. 오버로딩(overloading) 오버로딩은 매개변수의 형식, 개수를 다르게 해서 메서드가 다양한 유형의 요청에 답할 수 있게 하는 것이다. 예를 들어서, 덧셈을 위한 메서드를 만들었다. public int sum(int A, int B); 이 메서드는 두 정수를 받아서 두 수의 합을 반환하게 되어있다. 그런데 사용자가 3개의 정수의 합을 구하고 싶다고 한다면 어떻게할까? 이런 경우, 아래와 같이 메서드를 새로 하나 더 만들면 된다. public int sum3(int A, int B, int C); 하지만, 사용자가 다시 실수의 합을 구하는 메서드를 요청한다면? 또 double형식의 함수를 하나 더 만들고, pub..
목차 상속 상속은 어떤 한 클래스의 속성과 메서드를 다른 클래스에서도 쓸 수 있게 하는 것이다. 예를 들어, 어떤 게임의 몬스터를 전부 만들게 되었다고 해보자. 모든 몬스터 전부 public class slime{ private int hp; private int ATK; private int DEF; public void tackle() /* 등등 */ } public class wolf{ private int hp; private int ATK; private int DEF; public void bite() /* 등등 */ } 만들고 보니 hp, ATK, DEF 등 슬라임과 늑대는 서로 공통적으로 가지는 속성들이 많다. 다른 몬스터들을 생각해봐도, 이 속성들은 가지고 있어야 몬스터라 부를 수 있다...
목차 캡슐화 / Encapsulation 캡슐화는 데이터와 행위를 묶어 객체라는 형태로 만드는 것을 말한다. 앞서 말했던, 객체의 정의와 같다고 생각할 수 있다. 하지만, 캡슐화는 묶는 과정에서 속성(attribute), 메서드(method)를 외부로부터 감출 것인지, 공개할 것인지 설정할 수 있다는 것이 핵심이다. 바로 '데이터 은닉'기법이다. 데이터 은닉을 통해 감춰진 속성, 메서드는 외부에서는 접근할 수 없으며, 객체내부에서만 수정, 사용할 수 있다. 곡개하는 속성, 메서드는 'public' 접두어를, 비공개하는 속성 메서드는 'private' 접두어를 붙인다. 객체는 책임으로 이루어져있다. 우리는 어떤 객체에게 특정 행동을 기대하고, 객체를 만든다. 이때, 이 객체를 '1번객체'라고 하고, '2번..
목차 객체지향의 개념 객체지향 프로그래밍은 객체가 상호작용하는 방식으로 프로그램을 만드는 방법이다. 이런 객체지향 프로그래밍은 캡슐화, 다형성, 상속이라는 특성이 있다. 이 특성들을 가지고 있지 않으면 객체지향 언어라고 불릴 수 없을 만큼 중요한 특성이다. 내가 공부해온 책에서는, 또 하나의 특성, '합성'을 더해 객체지향을 말한다. 그런 객체지향의 특성을 나열해보자면 캡슐화 다형성 상속 합성 이 되겠다. 객체지향 프로그래밍을 하기 전에, 일단 객체가 무엇인지 알아야 객체지향적이 무엇인지 알고 프로그래밍을 할 수 있지 않겠는가? 먼저 객체가 무엇인지 알아보도록 하자 객체란? 일단 책에서 말하는 객체의 정의를 보고 알아가자. '객체는 우리가 인식하는 모든 대상, 물체 등 객관적으로 인식할 수 있는 대상이다..
목차 세그먼트 트리 어떤 수들의 집합이 있다. 그 집합은 원소가 마구마구 변할 수 있다고 한다. 이 때, 그 집합의 부분합을 아주 빠르게 구하기 위해서 만들어진 구조이다. 예를 들어서.. 1, 5, 6, 7, 4, 8, 2, 3 이렇게 수가 있다고 하자. 우리가 이 수들에서 특정 범위의 합을 구하려면 어떻게 해야할까? 역시 제일 간단한 방법은 다 더하는 것이다. 3~6번째 원소를 더하면. 6+7+4+8 = 25 이렇게 다 더하는 경우 시간복잡도는 O(N)으로 작은 범위 내에서 보면 나쁠 수 있다. 하지만, 이 합을 원하는 곳이 많아서 수천, 수만명이 요구를 한다면?? 또, 이 데이터에 접근 가능한 사람이 많아서 계속해서 값이 바뀐다면?? 참으로 난감할 것이다. 데이터는 바꿔줄 수 있지만. 합을 계속 해서..
목차 백준 7662번 이중 우선순위 큐. 우선순위는 큐에 들어가는 정수값 자체를 우선순위로 하는 이중 우선순위 큐이다. 최대힙과, 최소힙을 이용해서 구현을 해 보았다. 최대값을 제거할때는 최대힙에서 삭제연산을 하고, 삭제한 요소를 저장해둔다. 그리고 최소값을 제거할때 만약 제거하는 요소가 저장해둔 배열에 있다면, 한번더 삭제한다. void pop(heap *h, heap *h2, int num){ int temp; //최대값 삭제 if(num == 1){ temp = popM(h); for(int i = h->numsize-1; i > -1 ; i--){ if(temp == h->nums[i]){ temp = popM(h); h->nums[i] = h->nums[h->numsize--]; } } } //..