오늘도 끄적끄적

느리더라도 꾸준하게

다형성(Polymorphism)

객체지향 개념에서 다형성이란 여러 가지 형태를 가질수 있는 능력을 의미함.
자바에서는 한 타입의 참조 변수로 여러 타입의 객체를 참조할 수 있도록 함으로써 다형성을 프로그램적으로 구현함.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class TV2 {
boolean power;
int channel;

void power(){}
void channelUp(){}
void channelDown(){}
}

class CaptionTV extends TV2 {
String text;
void caption(){}
}

class Test4 {
public static void main(String[] args) {
TV2 t = new TV2();
CaptionTV c = new CaptionTV();
TV2 t2 = new CaptionTV();

System.out.println(c.text);
// System.out.println(t2.text); TV2에 생성된 것만 참조 가능.
// CaptionTV c2 = new TV2(); CaptionTV보다 TV2가 가진 멤버가 더 적어서 생성 불가능.
}
}

다음과 같은 특성을 지닌다.
참조변수 a = new 인스턴스타입() 을 기준으로 설명한다.

더 읽어보기 »

자바에 대한 근본도 없고, MVC, Servelet/JSP에 대한 이해도 제대로 없는데 이런 걸 해도 될런지 모르겠지만… 일단은 시작!
나머지는 병행해가면서 해보자…

스프링 vs 스프링 부트

  • 스프링: 프론트로 치면 웹팩, 바벨, 걸프 설정 등등을 처음부터 내가 다 짜줘야함.
  • 스프링 부트: CRA(Create React App) or Vue-CLI와 같이 알아서 설정을 도와줌.
    IntelliJ에서 프로젝트를 만들 때 Sprign Initializer를 선택하면 된다.
    보이지 않는다면 최신버전으로 업뎃하고 플러그인에서 Spring Boot가 제대로 설치/활성화 됐는지 확인하자.

스프링이란?

더 읽어보기 »

연습문제 실수

  • 기존의 코드를 재사용할 수 있으면 하자.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    public class SutdaCard {
    int num = 0;
    boolean isKwang = false;
    SutdaCard() {
    // 이 한줄로 커버 되고 이래야 유지보수 측면에서도 용이하다.
    this(1, true);
    // num = 1;
    // isKwang = true;

    }
    SutdaCard(int num, boolean isKwang) {
    this.num = num;
    this.isKwang = isKwang;
    }
    }
  • 형변환
    10f와 10.0f는 동일하니 쓸 데 없는 .0을 안 찍도록 하자.

  • 지역변수

    1
    2
    3
    public static void main(String[] args){

    }

    args도 지역변수다.
    또한 main은 변수가 아니라 (클래스) 메소드이다.
    자바스크립트에서는 함수를 변수에 담을 수 있어서 함수도 변수의 범주 안에 속하고,
    함수와 메소드가 유사한 측면을 갖고 있다보니 main 메소드도 static 키워드를 썼으므로 클래스 변수인 줄 알았는데 아니었다.

  • String vs StringBuffer

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    public class Test {
    static void change(String str) {
    str += "456";
    }

    static void change(StringBuffer str) {
    str.append("456");
    }

    public static void main(String[] args) {
    String str = "ABC123";
    System.out.println(str); // ABC123
    change(str);
    System.out.println("After change:"+str); // ABC123
    StringBuffer str2 = new StringBuffer("ABC123");
    System.out.println(str2); // ABC123
    change(str2);
    System.out.println("After change:"+str2); // ABC123
    }
    }

    String 클래스는 참조타입임에도 불구하고 내용을 변경할 수 없기 때문에 ABC123456이라는 새로운 변수를 지역변수 str에 만들고
    메소드 종료와 더불어 해당 지역변수도 날아가서 원하는 결과가 나오지 않는다.
    따라서 원하는 결과를 얻어내려면 return으로 반환 값을 받아오거나 StringBuffer 클래스를 이용해야한다.

상속

생성자와 초기화 블럭은 상속되지 않고, 멤버(변수, 메소드)만 상속된다.
접근 지정자가 private 또는 default는 상속은 받되, 자식 클래스에서 직접적인 접근이 불가능하다.

더 읽어보기 »

웰 컴 투 정규표현식

문자 & 단어 세기

1
2
3
4
5
6
7
8
9
10
11
const str =
`반응형웹, 반응형 웹, Responsive, responsive web 웹표준
웹표준, 웹 표준, Web Standard, web Standard`;

const countChar = (char, str) => {
const matchedChars = str.match(new RegExp(char, 'gmi'));
return matchedChars ? matchedChars.length : 0;
};

console.log(countChar('웹', str)); // 5
console.log(countChar('웹표준', str)); // 2

동음이의어 세기

더 읽어보기 »

프로젝트로 바로가기

왜 만들었나?

수작업을 줄여보자.

과거 어떤 사람이 프론트 엔드 개발자 채용 공고에서 직접 수집한 키워드를 빈도수 별로 모은 자료를 보여준 적이 있다.
이후에 크롤러의 존재에 대해 알고 나서 물어보니 수작업으로 했다고 한다. (그렇기 때문에 신뢰도가 좀 더 높은 것 같다.)
이런 수작업(노가다성)을 어떻게 하면 줄일 수 있을까 고민을 하면서 만들어보고 싶다는 막연한 생각만 가지고 있었다.

더 읽어보기 »

소스 코드 보러가기
사이트에서 원하는 내용만 수집해오는 크롤러.
더 나아가 mecab-ko와 같은 형태소 분석기를 사용하면 키워드 별로 분류하고 빈도수도 알아낼 수 있다.
무한 스크롤 페이지에 적합하게 만들었고, 페이지네이션 사이트를 크롤링 하려면 직접 구현해야한다.
원티드의 프론트 개발 지원 자격을 크롤링 하여 키워드 별로 분류 후 나타낸 그래프

설치

1
npm i

형태소 분석기(한국어 버전)

더 읽어보기 »

1
2
3
4
5
6
7
8
9
10
11
const nums = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];

// 제대로 작동하질 않는다.
nums.forEach(async (num) => {
await new Promise(res => {
setTimeout(() => {
console.log(num);
res();
}, 1000);
});
});
1
2
3
4
5
6
7
8
9
10
11
12
13
const nums = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];

// 역시 마찬가지로 제대로 작동하지 않는다.
(async() => {
nums.forEach(async (num) => {
await new Promise(res => {
setTimeout(() => {
console.log(num);
res();
}, 1000);
});
});
})();
1
2
3
4
5
6
7
8
9
10
11
12
13
const nums = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];

// 이터레이터에서는 잘 작동한다.
(async() => {
for(const num of nums) {
await new Promise(res => {
setTimeout(() => {
console.log(num);
res();
}, 1000);
});
}
})();
1
2
3
4
5
6
7
8
9
10
11
12
13
const nums = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];

// 물론 일반 반복문에서도 잘 작동한다.
(async() => {
for(let i=0, len=nums.length; i<len; i++) {
await new Promise(res => {
setTimeout(() => {
console.log(nums[i]);
res();
}, 1000);
});
}
})();
더 읽어보기 »

자알쓰란?

바스크립트 자. (잘 쓰자는 의미도 담겨있다.)
자바스크립트라는 언어 자체는 내 기준에서는 설계 상 미스가 참 많다.
함수 단위의 스코프, 호이스팅, 동적 타입 등등
자바와 같은 깐깐(?)한 언어를 배우고 바라본 자스는 허점 투성이처럼 보였다.
애초에 자바스크립트는 어떠한 프로그램을 만들기 위해서 탄생했다기 보다는
웹 페이지에 입력값에 대한 유효성 검사(데이터가 공란인지 아닌지 등등)와 같은
페이지의 동적 제어가 주된 목적 + 짧은 개발 기간(넷 스케이프 사의 새로운 브라우저에 탑재 예정) 때문에
설계 상에 미스가 있을 수 밖에 없다고 나는 생각된다.
일종의 안전 장치가 없어서 개발자가 일일이 구현해주고, 신경써야 하는 느낌이었다.
그렇다고 해서 자바스크립트를 극혐하거나 그런 것은 아니고 매우 사랑한다.
또한 그 허점을 아는 사람은 허점을 보완해서 요리조리 피해서 잘 쓰겠지만…
잘 모르는 부분들은 잘못 써도 동작이 잘 되기 마련이다.
이는 지금 당장에는 큰 문제가 안 될지 모르겠지만, 추후에 대규모 웹 어플리케이션을 만들거나
직면할 문제로부터 미리 해방시키기 위해 처음부터 좋은 습관을 들여가는 것이 좋다고 생각한다.
그 열 한 번째 시리즈는 변수를 주제로 진행하겠다.

변수란?

이번 주제는 정재남 님의 자바스크립트 세미나를 듣고 해당 자료를 토대로 내 맘대로 해석한 포스트이다.

더 읽어보기 »

자알쓰란?

바스크립트 자. (잘 쓰자는 의미도 담겨있다.)
자바스크립트라는 언어 자체는 내 기준에서는 설계 상 미스가 참 많다.
함수 단위의 스코프, 호이스팅, 동적 타입 등등
자바와 같은 깐깐(?)한 언어를 배우고 바라본 자스는 허점 투성이처럼 보였다.
애초에 자바스크립트는 어떠한 프로그램을 만들기 위해서 탄생했다기 보다는
웹 페이지에 입력값에 대한 유효성 검사(데이터가 공란인지 아닌지 등등)와 같은
페이지의 동적 제어가 주된 목적 + 짧은 개발 기간(넷 스케이프 사의 새로운 브라우저에 탑재 예정) 때문에
설계 상에 미스가 있을 수 밖에 없다고 나는 생각된다.
일종의 안전 장치가 없어서 개발자가 일일이 구현해주고, 신경써야 하는 느낌이었다.
그렇다고 해서 자바스크립트를 극혐하거나 그런 것은 아니고 매우 사랑한다.
또한 그 허점을 아는 사람은 허점을 보완해서 요리조리 피해서 잘 쓰겠지만…
잘 모르는 부분들은 잘못 써도 동작이 잘 되기 마련이다.
이는 지금 당장에는 큰 문제가 안 될지 모르겠지만, 추후에 대규모 웹 어플리케이션을 만들거나
직면할 문제로부터 미리 해방시키기 위해 처음부터 좋은 습관을 들여가는 것이 좋다고 생각한다.
그 열 번째 시리즈는 자료형 중에 객체를 주제로 진행하겠다.

자료형

0과 1로 이루어진 데이터를 메모리에서 꺼내서 써야하는데 어떻게 해석할지를 결정하는 유형.
나는 위와 같이 이해하고 있는데 잘 이해가 가지 않는다면 그냥 넘어가도 무방하다.
더 딥하게 알고 싶은 사람은 정적 타입의 언어(C, Java 등등)을 공부해보자.

더 읽어보기 »
0%