this 1. this 키워드 객체는 상태를 나타내는 프로퍼티와 동작을 나타내는 메서드로 구성된다.( 이 둘을 합쳐서 간단하게 프로퍼티라고도 한다.) 메서드는 자신이 속한 객체의 상태, 즉 프로퍼티를 참조하고 변경해야할 때가 있다. 이 때 메서드가 자신이 속한 객체의 프로퍼티를 참조하려면 먼저 자신이 속한 객체를 가리키는 식별자를 참조할 수 있어야 한다. 1.1 객체리터럴 방식으로 생성한 객체 const circle = { radius : 5, getDiameter(){ return 2 * circle.radius } } console.log(circle.getDiameter()) // 10 다음과 같이 circle 객체를 객체리터럴 방식으로 생성하고 getDiameter 메서드를 호출하면 정확한 답이 ..
인터페이스 2 1. 타입 단언 이전에 interface 1편에서 interface 변수는 할당 받은 타입의 고유 메서드를 사용할 수 없다고 했다. 즉, 자바에서처럼 인터페이스와 구현체 모두 존재하는 메서드가 아닌, 구현체 내부에서만 존재하는 메서드는 인터페이스에서 사용할 수 없는 것처럼 말이다. 그렇다면 자바에서는 어떻게 했는가?? 타입을 변환해주면 되었다. go에서의 인터페이스 역시도 타입을 변환하면 될 것 같다. 참고로 go에서의 타입 변환은 다음과 같다. value_float := 1.2 value_int := int(value_float) 이전에 사용했던 예제를 가져와보자 package main import "fmt" type TapeInterface interface { Play(string) ..
인터페이스 1. 인터페이스 자바에서 객체 지향과 디자인 패턴의 핵심은 인터페이스이다. go 역시도 인터페이스를 지원하는 아주 재밌는 언어이다. 인터페이스를 사용하는 가장 큰 이유는 어떤 값이 어떤 특징 타입을 갖는지 관심이 없는 경우가 있기 때문이다. 그 값이 무엇인지보다는 그 값으로 어떤 일을 할 수 있는 지에 대해서 더 관심을 두는 경우가 있다. 즉, 어떤 값에서 특정 메서드를 호출할 수 있는 지가 주요 관심사인 것이다. 가령, 자판기가 있다면 버튼을 눌러서 음료수를 꺼내는게 우리의 관심사이지, 이 자판기가 어느 제조사에서 만들어졌는지는 중요하지 않다. 이럴 때 사용하는 것이 바로 인터페이스인 것이다. 1.1 동일한 메서드를 가진 서로 다른 타입 다음의 예제를 보도록 하자 package main im..
구조체 2 지난 번에는 구조체를 선언하고, 이를 사용하는 방법을 배웠다. 그러나, 구조체는 이것이 다가 아니다. c언어에서는 구조체에 함수를 넣어줄 수 없지만, c++이 되면서 구조체에 함수를 넣어줄 수 있었다. 이것이 필요한 이유는 사용자 정의 타입에서 메서드를 정의하면 메서드 이름이 같지만 다른 사용자 정의 타입 간에는 충돌이 발생하지 않기 때문이다. golang 역시도 마찬가지 이다. 다음의 문제 상황을 해결해보자 package main import "fmt" type Coffee struct { name string price int } type Tea struct { name string price int } func drinkCoffee(coffee Coffee, money *int) { fm..
프로토타입 4편 1. 직접 상속 Object.create에 의한 직접 상속이 가능하다. Object.create 메서드는 명시적으로 프로토타입을 지정하여 새로운 객체를 생성한다. Object.create메서드도 다른 객체 생성 방식과 마찬가지로 추상 연산 OrdinaryObjectCreate를 호출한다. Object.create메서드의 첫 번째 매개변수에는 생성할 객체의 프로토타입으로 지정할 객체를 전달한다. 두 번째 매개변수에는 생성할 객체의 프로퍼티 키와 프로퍼티 디스크립터 객체로 이루어진 객체르 전달한다. 이 객체 형식은 Object.defineProperties 메서드의 두번째 인수와 동일하다. 두번째 인수는 옵션이므로 생략이 가능하다. //프로토타입이 null인 객체를 생성, 즉, 생성된 객체는..
프로토타입 3편 1. 프로토타입 체인 function Person(name){ this.name = name } Person.prototype.hello = function(){ console.log(`my name is ${this.name}`) } const me = new Person('lee') console.log(me.hasOwnProperty('name')) // true console.log(Person.prototype.hasOwnProperty('name')) // false 지난 번의 예제이다. 어떻게 me와 Person.prototype은 hasOwnProperty 프로퍼티를 가지고 있을까?? 이는 프로토타입 체인 덕분이다. Object.g..
프로토타입 2편 1. 리터럴 표기법에 의해 생성된 객체의 생성자 함수와 프로토타입 이전 포스팅에서 살펴본 것과 같이, 생성자 함수에 의해 생성된 인스턴스는 프로토타입의 constructor 프로퍼티에 의해 생성자 함수와 연결된다. 이때, constructor 프로퍼티가 가리키는 생성자 함수는 인스턴스를 생성한 생성자 함수와 같다. const obj = new Object() console.log(obj.constructor === Object) // true const add = new Function('a' , 'b', 'return a + b') console.log(add.constructor === Function) // true function Pers..
프로토타입 1편 js에서 중요한 요소 중 하나이지만, 모르는 사람이 생각보다 많다. 가끔씩 회사 문제로 기본적인 js 문법이 나오는데, 그 중에 가장 많이 나오는 것이 prototype이다. 왜냐면 모르면 그냥 맞아야 하기 때문이다. 자바스크립트는 명령형, 함수형, 프로토타입 기반 객체지향 프로그래밍을 지원하는 멀티 패러다임 프로그래밍 언어이다. 자바와 c++과는 달리 js는 클래스 기반의 객체지향 프로그래밍이 아닌, 프로토타입 기반의 객체지향 프로그래밍 언어이다. 참고로, ES6에서 클래스가 도입되었다. 하지만 ES6의 클래스가 기존의 프로토타입 기반 객체지향 모델을 폐지하고 새로운 객체지향 모델을 제공하는 것은 아니다. 사실 클래스도 함수이며, 기존 프로토타입 기반 패턴의 syntatuc sugar이..