오버로딩 오버로딩은 이 전 게시물인 클래스(생성자) 파트에서 설명을 했었다. 한개의 클래스 내에서 동일한 메서드명 2개를 선언할 수 없지만, 메서드명이 같아도 파라미터나 타입이 다르다면 한 클래스 내에서도 동일한 메서드 2개를 선언할 수 있다. 가 골자였다. 즉, class ClassB { ClassB() { System.out.print('A'); } void prn() { System.out.print('B'); } void prn(int x) { System.out.print(x) } } // void prn이라는 메서드 명은 같지만 // 받는 파라미터가 다르다. // 따라서 호출 시 prn(int 5)로 한다면 // print(5)가 호출되고 // prn();으로 호출했다면 // print('B'..
이 글에서는 클래스에 대한 간략한 이해 및 생성자, 오버로딩, 오버라이딩 등에 대해 알아보려고 한다. 클래스... 클래스가 무엇일까? 클래스는 객체지향프로그래밍의 꽃이자 열매같은 것으로써 클래스를 통해 연관있는 객체들을 생성하는 등 여러 것들을 클래스로 묶어서 모듈화 등에 기여할 수 있다. 자바에서는 클래스를 선언하고 그 클래스를 생성자로 써서 클래스에 따른 객체들을 만드는 과정을 끊임없이 하는데 이러한 과정을 이해할 수 있느냐 없느냐가 정보처리기사에서 요구하는 수준인 것 같다. 클래스로는 다양한 객체들을 만들어낼 수 있다. 예를들어 자동차라는 클래스가 있다고 가정해보자. 이 자동차 클래스를 통해 소나타, 모닝, 포터, 람보르기니 등 다양한 객체들을 찍어낼 수 있다. 이 때 클래스를 통해 찍어낸 객체들을..
이번에도 시나공 책을 기반으로 포스팅을 할 것이다. 다만 추상적으로 따라치지는 않고 남에게 설명할 수 있을 정도로 이해해서 남겨보도록 하겠다. 위에서 아래로 쭉쭉 읽는 프로그래밍에서, 제어문은 그 방향을 비트는 역할을 하는 명령문이다. 무한 반복을 한다던지, 어느 상태에서는 이런걸 한다던지 등등 그 사용성이 무궁무진하다. 제어문에는 for문, if문, while문, switch문 등등이 있는데, 하나만 쓰이는 일은 없고 죄다 섞여서 나온다. 각 제어문에 대해 기초를 배우고 싶다면 구글에 검색을 한번 해보자. 내가 기초에 대해 어줍잖게 쓰는 것은 읽는 분들에게도 나에게도 시간낭비 일 수 있다. 대신 실제 문제에 대한 내 해석을 아래에 써보도록 하겠다. 아래는 20년 10월 자바로 구현된 코드 문제이다. p..
C언어와 파이썬, 자바스크립트는 경험이 있는데 유독 JAVA만 경험이 없다. 그래서 정처기 문제 중 자바 관련 문제가 나오면 심히 메롱스럽다. 메롱스러우면 어쩔텐가 열심히 해야지!! 먼저 모든 프로그래밍의 기초인 데이터 입출력부터 찬찬히 공부해보자. 늦었다고 할 때는 이미 늦었다. 그니까 더욱 열심히 해야한단다. 해보자! 일단 당장 자바를 깔기엔 노동력 소모가 심하다. 다행히 웹에서 자바를 구동할 수 있는 사이트가 있다. https://www.jdoodle.com/online-java-compiler/ JDoodle - free Online Compiler, Editor for Java, C/C++, etc JDoodle is a free Online Compiler, Editor, IDE for Jav..
객체 지향 관점에서, 어떤 상위 대상이 하위 대상을 포함하는 것이라면 그 공통점을 한데 묶어 주형처럼 객체를 찍어내는 것은 프로그래밍을 함에 있어서 상당한 시간 단축을 이뤄줄 수 있다. 이는 생성자 함수로 실현시킬 수 있다. 하지만 객체를 주형으로 찍어내면서도, 공통적으로 가지고 있으면 좋을법한 것은 굳이 새로이 찍어지는 객체에 추가하지않고, 상위 대상이 가진 것을 그대로 공유하여 쓰게할 수 있다. 이는 자바스크립트에서 지향하는 프로그래밍 방법이며 이를 상속(inheritance)이라고 한다. 이를 할 수 있게 하는 자바스크립트의 방법 중 가장 잘 알려져있는 것 중 프로토타입이 있다. 일단 생성자 함수부터 보자. //생성자 함수 function Circle(radius) { this.radius = ra..
객체지향 프로그래밍의 정의 과거의 프로그래밍은 함수나 명령어를 나열하는 명령형 프로그래밍이었다면 객체지향 프로그래밍은 실세계에 존재할법한 것들을 하나의 객체로 묶어 프로그래밍을 시도하는 하나의 철학적 도전이다. 실체는 특징이나 특성을 나타내는 속성을 가지고 있고, 이를 통해 개체를 구별할 수 있다. 만약 내가 철수와 영희로 프로그래밍을 한다고 가정하자. 이 때 내가 각 사람들의 성별에만 관심이 있다면 나머지는 전부 제외하고 봐도 무방하다. 이처럼 필요한 속성을 간추려내는 것을 추상화(abstraction)라고 한다. 상태와 동작, 프로퍼티와 메서드 위에서 철수는 남자이고 축구를 잘한다. 영희는 여자이고 볼링을 잘한다. 이 때, 각 성별(남자, 여자)은 철수와 영희의 state(상태)이다. 축구를 하는 것..
async / await를 사용하면 비동기 처리를 동기 처리처럼 구현하기가 쉬워진다. async / await는 프로미스를 기반으로 동작한다. async / await를 사용하면 프로미스의 then/catch/finally 후속 처리 메서드에 콜백함수를 전달해서 비동기 처리 결과를 동기 처리처럼 프로미스를 사용할 수 있다. async 함수 await 함수는 반드시 async 함수 내부에서 사용해야 한다. async 함수는 async 키워드를 사용해 정의하며 언제나 프로미스를 반환한다. async 함수가 명시적으로 프로미스를 반환하지 않더라도 async 함수는 암묵적으로 반환값을 resolve하는 프로미스를 반환한다. // async 함수 선언문 async function foo(n) {return n;}..
이터러블의 구현 이터러블을 구현하기 위해 일반 객체에 [Symbol.iterator](), next()를 구현하는 것은 번거롭다. 제너레이터를 활용하면 간단하게 이터러블을 구현할 수 있다. 앞서 해보았던 피보나치 수열을 제너레이터를 활용하여 만들어보자. const fibonacci = (function* () { let [pre, cur] = [0, 1]; while (true) { [pre, cur] = [cur, pre + cur]; yield cur; } }()) for (const num of fibonacci) { if (num > 5000) break; console.log(num); }
제너레이터 코드 블록의 실행을 일시 중지했다가 필요한 시점에 재개할 수 있는 특수한 함수. 제너레이터 함수를 호출하면 제너레이터 객체가 반환된다. (함수 코드가 실행되는 것이 아니다.) 제너레이터 함수의 정의 function* 과 같이 function 뒤에 애스터리스크(*)를 붙여서 함수를 정의한다. 또한 하나의 yield 표현식을 포함한다. 이것을 제외하면 일반 함수를 정의하는 것과 동일하다. 하지만 화살표 함수와 new 연산자를 통한 생성자 함수로는 호출할 수 없다. // 제너레이터 함수 선언문 function* genDecFunc() { yield 1; }; // 제너레이터 함수 표현식 const genExpFunc = function* () { yield 1; }; // 제너레이터 메서드 cons..
이터레이션의 프로토콜을 준수하지 않은 일반 객체도 이터레이션 프로토콜을 준수하도록 구현하면 사용자 정의 이터러블이 된다. 먼저 이터레이션에 대해 한번 더 복습해보자. 이터레이션 : 이터러블의 Symbol.iterator 메서드를 호출하면 반환되는 것. 이터레이션은 next 메서드를 갖는다. next 메서드는 각 요소를 순회하기 위한 포인터 역할을 하며, value 프로퍼티와 done 프로퍼티를 갖는 이터레이터 리절트 객체를 반환한다. const fibonacci = { [Symbol.iterator]() { let [pre, cur] = [0, 1]; const max = 20; return { next() { [pre, cur] = [cur, pre + cur]; return {value: cur, d..