반응형

Array 객체

Array객체는 여러가지 자료를 쉽게 관리할 수 있게 도와주는 객체입니다.

 

생성

Array객체는 생성자 함수로 생성합니다.

생성자 함수 설명
Array() 빈 배열을 만듭니다.
Array(number) 매개변수만큼의 크기를 가지는 배열을 만듭니다.
Array(any, ..., any) 매개변수를 배열로 만듭니다.

Array객체는 아래처럼 총 네 가지 방법으로 생성할 수 있습니다.

 

Array 객체 생성 예

var array1 = [1, 2, 3, 4, 5];
var array2 = new Array();
var array3 = new Array(10);
var array4 = new Array(1, 2, 3, 4, 5);

 

속성과 메서드

배열은 몇 개의 요소가 있는지 나타내는 length속성이 있습니다.

 

Array 객체의 속성

속성 설명
length 요소의 개수를 알아냅니다.

 

Array 객체의 length 속성 예

var array = ['A', 'B', 'C', 'D'];

var output = '';

for(var i = 0; i < array.length; i++) {
    output += i + ' : '  + array[i] + '\n';
}

console.log(output);
/*
0 : A
1 : B
2 : C
3 : D
*/

 

Array 객체의 메서드

메서드 설명
concat() 매개변수로 입력한 배열의 요소를 모두 합쳐 배열을 만들어 리턴합니다.
join() 배열 안의 모든 요소를 문자열로 만들어 리턴합니다.
*pop() 배열의 마지막 요소를 제거하고 리턴합니다.
*push() 배열의 마지막 부분에 새로운 요소를 추가합니다.
*reverse() 배열의 요소 순서를 뒤집습니다.
slice() 요소의 지정한 부분을 리턴합니다.
*sort() 배열의 요소를 정렬합니다.
*splice() 요소의 지정한 부분을 삭제하고 삭제한 요소를 리턴합니다.

* 표시된 메서드는 자기 자신을 변화시킵니다.

 

sort() 메서드( Array 객체의 메서드를 사용할 때 주의할 점 ) 예

var array = [5, 543, 1, 32432, 111];

array.sort();

console.log(array); // 1, 111, 32432, 5, 543

sort()메서드를 사용하면 모든 요소를 문자열 오름차순으로 정렬합니다. 따라서 위 코드처럼 Array 객체가 '문자열 오름차순'으로 정렬됩니다.

:: 숫자 오름차순이 아닌 문자열 오름차순으로 정렬됩니다.

 

정렬

Array 객체의 sort()메서드의 정렬 방법에 변화를 주고 싶을 때는 sort()메서드의 매개변수로 함수를 넣어줍니다. sort()메서드의 매개변수로 넣는 함수는 기본적으로 다음과 같이 매개변수 두 개를 받을 수 있어야 합니다.

 

sort() 메서드 형태

array.sort(function(left, right) {

});

웹 브라우저는 이 함수를 이용해 퀵 소트 또는 머지 소트 같은 정렬을 진행합니다. 간단하게 하면 정렬 기준을 매개변수로 입력한 함수가 리턴하는 숫자의 부호에 따라 정렬 방식이 결정됩니다.

배열의 자료를 정렬하는 경우는 대부분 숫자를 정렬하는 경우가 많으므로 아래 형태를 많이 사용합니다.

오름차순 내림차순
function(left, right) {
    return left - right;
}
function(left, right) {
    return right - left;
}

위 표처럼 코드를 사용하면 아래코드처럼 숫자 오름차순으로 정렬할 수 있습니다.

 

sort() 메서드의 정렬 방식 지정 예

var array = [5, 543, 1, 32432, 111];

array.sort(function(left, right) {
    return left - right;
});

console.log(array); // 1, 5, 111, 543, 32432

 

학생 성적 정렬 예

function Student(name, korean, math, english, science) {
    this.name = name;
    this.korean = korean;
    this.math = math;
    this.english = english;
    this.science = science;

    // 메서드
    this.getSum = function() {
        return this.korean + this.math + this.english + this.science;
    };
    this.getAverage = function() {
        return this.getSum() / 4;
    };
    this.toString = function() {
        return this.name + '\t' + this.getSum() + '\t' + this.getAverage();
    };
}

var students = [];
students.push(new Student('shiro', 99, 67, 78, 55));
students.push(new Student('AAA', 65, 99, 43, 12));
students.push(new Student('BBB', 74, 78, 65, 43));
students.push(new Student('CCC', 12, 33, 86, 55));
students.push(new Student('DDD', 44, 64, 48, 65));
students.push(new Student('EEE', 54, 65, 68, 100));

// 3등까지만 배열에 남기기
students.sort(function(left, right) {
    return right.getSum() - left.getSum();
});
students = students.slice(0, 3);

var output = '이름 \t 총점 \t 평균 \n';
for(var i = 0; i < students.length; i++) {
    output += students[i].toString() + '\n';
}

console.log(output);
/*
이름    총점    평균 
shiro  299    74.75
EEE    287    71.75
BBB    260    65
*/

sort()메서드와 slice()메서드를 사용해서 총점을 내림차순으로 정렬하고 0번째 인덱스부터 세 개만 변수 students에 다시 할당했습니다.

sort()메서드는 정렬한 배열을 리턴하기 때문에, 아래 코드처럼 메서드 체이닝을 사용할 수도 있습니다.

 

객체 메서드 체이닝 예

// 3등까지만 배열에 남기기 (메서드 체이닝 ver.)
students = students.sort(function(left, right) {
    return right.getSum() - left.getSum();
}).slice(0, 3);

 

요소 제거

Array객체의 메서드에는 특정 요소를 제거하는 메서드가 따로 없습니다. 대신 splice()메서드를 사용하면 특정 요소를 제거하는 기능을 만들 수 있으며 아래코드처럼 프로토타입에 remove()메서드를 추가하면 배열의 요소를 쉽게 제거할 수 있습니다.

 

Array 객체의 remove() 메서드 예

// Array 생성자 함수의 프로토타입에 remove()메서드를 추가합니다.
Array.prototype.remove = function(index) {
    this.splice(index, 1);
}

위 코드에서 만든 remove()메서드는 매개변수로 삭제하고자 하는 인덱스를 적으면 되므로 쉽게 사용할 수 있습니다. 반복문으로 특정 조건에 맞는 Array객체의 요소를 제거할 때는 주의사항이 있습니다.

 

잘못된 Array 객체의 요소 제거 예

// Array 생성자 함수의 프로토타입에 remove()메서드를 추가합니다.
Array.prototype.remove = function(index) {
    this.splice(index, 1);
}

var array = [52, 273, 103, 32, 274, 129];

for(var i = 0; i < array.length; i++) {
    if(array[i] > 100) {
        array.remove(i);
    }
}
console.log(array); // 52, 103, 32, 129

배열의 요소가 제거되면서 인덱스가 앞으로 당겨지기 때문에 이러한 문제가 발생합니다.

1번 요소인 273이 지워지면 2번 요소였던 103이 1번 요소로 바뀌면서 문제가 발생하는 것입니다.

 

올바른 Array 객체의 요소 제거( 역 for 반복문 ) 예

// Array 생성자 함수의 프로토타입에 remove()메서드를 추가합니다.
Array.prototype.remove = function(index) {
    this.splice(index, 1);
}

var array = [52, 273, 103, 32, 274, 129];

for(var i = array.length - 1; i >= 0 ; i--) {
    if(array[i] > 100) {
        array.remove(i);
    }
}
console.log(array); // 52, 32

 

반응형
반응형

String 객체

String객체는 자바스크립트에서 가장 많이 사용하는 내장 객체입니다.

 

String 객체 생성하기 예

var string = "Hello World";
var stringConstructor = new String("Hello World");

var output = '';
output += typeof (string) + '\n';
output += typeof (stringConstructor) + '\n';
console.log(output);
/*
string
object
*/

 

기본 속성과 메서드

String객체는 length속성을 갖습니다.

속성 설명
length 문자열의 길이를 나타냅니다.

글자 수를 이용하는 프로그램은 굉장히 많이 있습니다.

 

String 객체의 length 속성

var char = prompt("비밀번호를 입력해주세요", "6글자 이상");

if(char.length < 6) {
    alert("6글자 이상 입력해주세요.");
} else {
    alert("로그인되었습니다.");
}

위 코드를 실행하면 사용자에게 문자열을 입력받고 5글자까지는 "6글자 이상 입력해주세요." 경고창을 출력하고, 6글자 이상이면 "로그인되었습니다" 경고창을 출력합니다.

 

String객체는 속성이 하나밖에 없지만 메서드는 굉장히 많습니다. String객체의 메서드는 크게 기본 메서드와 HTML관련 메서드로 구분됩니다.

 

String 객체의 메서드

메서드 설명
charAt(position) position에 위치하는 문자를 리턴합니다.
charCodeAt(position) position에 위치하는 문자의 유니코드 번호를 리턴합니다.
concat(args) 매개변수로 입력한 문자열을 이어서 리턴합니다.
indexOf(searchString, position) 앞에서부터 일치하는 문자열의 위치를 리턴합니다.
lastIndexOf(searchString, position) 뒤에서부터 일치하는 문자열의 위치를 리턴합니다.
match(regExp) 문자열 안에 regExp가 있는지 확인합니다.
replace(regExp, replacement) regExp를 replacement로 바꾼 뒤 리턴합니다.
search(regExp) regExp와 일치하는 문자열의 위치를 리턴합니다.
slice(start, end) 특정 위치의 문자열을 추출해 리턴합니다.
split(separator, limit) separator로 문자열을 잘라서 배열을 리턴합니다.
substr(start, count) start부터 count까지 문자열을 잘라서 리턴합니다.
substring(start, end) start부터 end까지 문자열을 잘라서 리턴합니다.
toLowerCase() 문자열을 소문자로 바꾸어 리턴합니다.
toUpperCase() 문자열을 대문자로 바꾸어 리턴합니다.

 

잘못된 String 객체의 메서드 사용 예

var string = 'abcdasdf';

string.toUpperCase();
console.log(string); // abcdasdf

 

올바른 String 객체의 메서드 사용 예

var string = 'abcdasdf';

string = string.toUpperCase();
console.log(string); // ABCDASDF

위 코드를 실행하면 대문자를 출력합니다.

 

HTML 관련 메서드

HTML 관련 메서드는 자기 자신을 변화시키지 않고 리턴합니다.

메서드 설명
anchor() a 태그로 문자열을 감싸 리턴합니다.
big() big 태그로 문자열을 감싸 리턴합니다.
blink() blink 태그로 문자열을 감싸 리턴합니다.
bold() b 태그로 문자열을 감싸 리턴합니다.
fixed() tt 태그로 문자열을 감싸 리턴합니다.
fontcolor(colorString) font 태그로 문자열을 감싸고 color 속성을 주어 리턴합니다.
fontsize(fontSize) font 태그로 문자열을 감싸고 size 속성을 주어 리턴합니다.
italics() i 태그로 문자열을 감싸 리턴합니다.
link(linkRef) a 태그에 href 속성을 지정해 리턴합니다.
small() small 태그로 문자열을 감싸 리턴합니다.
strike() strike 태그로 문자열을 감싸 리턴합니다.
sub() sub 태그로 문자열을 감싸 리턴합니다.
sup() sup 태그로 문자열을 감싸 리턴합니다.

 


 

메서드 체이닝

자바스크립트의 기술 중 메서드 체이닝(Method Chaining)이라는 기술이 있습니다.

간단하게 메서드를 줄줄이 사용한다는 뜻입니다.

 

기본적인 메서드 사용 예

var string = "Hello World";

string = string.toLowerCase();
string = string.substring(0, 7);
string = string.anchor('name');

console.log(string); // <a name="name">hello w</a>

String객체의 메서드들은 자기 자신의 내용을 바꾸지 않고 리턴하므로 조금 귀찮지만 이렇게 사용합니다.

자기 자신을 바꾸지 않는 이유는 여러가지가 있지만 메서드 체이닝을 그 이유 중 하나로 들 수 있습니다. String객체의 메서드를 사용하면 String객체를 리턴하므로 아래코드처럼 연속해서 메서드를 사용할 수 있습니다.

 

메서드 체이닝

var string = "Hello World";

string = string.toLowerCase().substring(0, 7).anchor('name');

console.log(string); // <a name="name">hello w</a>

String객체의 메서드를 체이닝한다고 String객체의 메서드만 사용할 수 있는 것은 아닙니다. 예를 들어 String 객체의 charCodeAt()메서드를 사용하면 Numer객체를 리턴하므로, 곧바로 Number객체의 메서드로 체이닝할 수도 있습니다.

 

반응형
반응형

Number 객체

Number객체는 자바스크립트에서 가장 단순한 객체로 숫자를 표현할 때 사용합니다.

 

Number 객체 생성 예

var number = 100;
var numberConstructor = 100;

console.log(typeof (number)); // number
console.log(typeof (numberConstructor)); // number

 

메서드

Number객체는 Object객체가 갖는 일곱 가지 메서드는 물론이고 아래 메서드를 추가로 갖습니다.

메서드 설명
toExponential() 숫자를 지수 표시로 나타낸 문자열을 리턴합니다.
toFixed() 숫자를 고정 소수점 표시로 나타낸 문자열을 리턴합니다.
toPrecision() 숫자를 길이에 따라 지수 표시 또는 고정 소수점 표시로 나타낸 문자열을 리턴합니다.

위 표의 메서드는 모두 매개변수로 숫자를 하나 입력받습니다. toPrecision()메서드는 유효 숫자의 자릿수를 의미하며, 그 외에 메서드는 소수점 몇째 자리까지 나타낼 것인지를 의미합니다.

세 메서드 모두 비슷한 기능을 수행합니다.

 

Number 객체의 메서드 예

var number = 100.235456;

var output = '';
output += number.toFixed(1) + '\n';
output += number.toFixed(4);

console.log(output);
/*
100.2
100.2355
*/

 

직접 호출하기 예

var number = (100.235456).toFixed(2);
console.log(number); // 100.24

 

변수 안에 숫자를 넣지 않아도 메서드를 사용할 수 있습니다.

 


 

생성자 함수의 속성

 

생성자 함수의 속성과 메서드 생성 예

function Constructor() {}
Constructor.property = 222;
Constructor.method = function() {};

console.log(Constructor.property); // 222

위 코드를 실행하면 property속성을 정상적으로 출력합니다. 이렇게 함수는 속성과 메서드를 가질 수 있습니다.

Number생성자 함수도 아래처럼 속성과 메서드가 있습니다.

 

Number 생성자 함수의 속성 표

속성 설명
MAX_VALUE 자바스크립트의 숫자가 나타낼 수 있는 최대 숫자
MIN_VALUE 자바스크립트의 숫자가 나타낼 수 있는 최소 숫자
NaN 자바스크립트의 숫자로 나타낼 수 없는 숫자
POSITIVE_INFINITY 양의 무한대 숫자
NEGATIVE_INFINITY 음의 무한대 숫자

 

Number 객체의 MAX_VALUE 속성 예

var number = Number.MAX_VALUE + 1;

console.log(number); // 1.7976931348623157e+308

최대 숫자에 1을 더해도 출력에 Infinity를 출력하지 않고 '1.7976931348623157e+308'라는 결과를 출력했습니다.

이 결과는 실제로 1을 더한 것이 아닙니다.

지수 표기로 전환됐을 때는 적어도 아래 코드만큼의 수치를 더해야 1을 더한 것이 됩니다.

 

Number.MAX_VALUE에서 Infinity로 변환 예

var addNumber = Number('0.0000000000000001e+308');
var number = Number.MAX_VALUE + addNumber;

console.log(number); // Infinity

자바스크립트는 1.7976931348623157e+308까지 나타낼 수 있기 때문에 그 이후부터는 무한한 양의 숫자로 인식합니다.

 

반응형
반응형

Object 객체

Object객체는 자바스크립트의 최상위 객체입니다.

 

생성

자바스크립트의 가장 기본적인 내장 객체는 Object객체입니다. 정확히는 Object생성자 함수로 만든 인스턴스입니다.

 

Object객체 생성하기 예

var object = {};

var object = new Object();

Object객체는 위 두 가지 방법으로 생성할 수 있습니다.

Object객체는 아래 처럼 일곱 가지의 메서드가 있습니다.

메서드 설명
constructor() 객체의 생성자 함수를 나타냅니다.
hasOwnProperty(name) 객체가 name속성이 있는지 확인합니다.
isPrototypeof(object) 객체가 object의 프로토타입인지 검사합니다.
propertyIsEnumerable(name) 반복문으로 열거할 수 있는지 확인합니다.
toLocaleString() 객체를 호스트 환경에 맞는 언어의 문자열로 바꿉니다.
toString() 객체를 문자열로 바꿉니다.
valueOf() 객체의 값을 나타냅니다.

 

hasOwnProperty()메서드와 propertyIsEnumerable()메서드

var object = { property: 273 };

var output = '';
output += "HOP('property'): " + object.hasOwnProperty('property') + '\n';
output += "HOP('constructor'): " + object.hasOwnProperty('constructor') + '\n';
output += "PIE('property'): " + object.propertyIsEnumerable('property') + '\n';
output += "PIE('constructor'): " + object.propertyIsEnumerable('constructor') + '\n';

console.log(output);
/*
HOP('property'): true
HOP('constructor'): false
PIE('property'): true
PIE('constructor'): false
*/

for(var key in object) {
    console.log(key) // property
    console.log(object[key]); // 273
}

위 코드를 실행하면 property속성을 검싸한 것은 모두 true를 출력하고 constructor속성을 검사한 것은 모두 false를 출력합니다.

propertyIsEnumerable()메서드를 true로 가지는 속성만 for in반복문으로 출력합니다. 

 

toString() 메서드

var object = new Object();

alert(object); // [object object]
alert(object.toString()); // [object object]

toString()메서드는 객체를 문자열로 변환하는 메서드입니다.

위 코드를 실행하면 두 출력 결과가 같습니다. toString()메서드는 객체를 문자열로 변환할 때 자동으로 호출되기 때문입니다.

 

toString() 메서드 재선언

var student = {
    name: 'shiro',
    grade: '대학교 4학년',
    toString: function() {
        return this.name + ' : ' + this.grade;
    }
};

alert(student); // shiro : 대학교 4학년

위 코드는 객체를 만들고 내부에서 toString()메서드를 선언합니다.

원래 모든 객체는 toString()메서드를 갖는데 다시 선언했기 때문에 재선언한 것입니다. 자바스크립트는 객체를 문자열로 변환할 때 자동으로 toString()메서드를 호출한다고 했으므로 shiro : 대학교 4학년을 호출하게 되는 것입니다.

 

반응형
반응형

기본 내장 객체

 

기본 자료형과 객체의 차이점

기본 자료형은 자바스크립트의 여섯가지 자료형 중 숫자, 문자열, 불 세 가지 자료형을 의미합니다. 기본 자료형과 객체의 특성이 다르므로 차이를 둡니다.

 

기본 자료형과 객체 예

var defaultNumber = 273;
var objectNumber = new Number(273);

var output = '';
output += typeof (defaultNumber) + ' : ' + defaultNumber + '\n';
output += typeof (objectNumber) + ' : ' + objectNumber;

console.log(output);
/*
number : 273
object : 273
*/

위 코드에서 기본 자료형과 객체는 자료형이 분명히 다릅니다. 하지만 두 가지 모두 값을 출력합니다.

기본 자료형의 속성이나 메서드를 사용하면 기본 자료형이 자동으로 객체로 변환되기 때문입니다.


예를 들어 기본 자료형 숫자의 속성이나 메서드를 사용할 때는 자동으로 Number객체로 변환되므로, 기본 자료형이 속성이나 메서드를 사용할 수 있는 것입니다. 따라서 기본 자료형과 객체의 차이점을 찾기가 힘듭니다.

굳이 차이점을 본다면 기본 자료형은 객체가 아니기 때문에 속성과 메서드를 추가할 수 없습니다.

 

기본 자료형에서 메서드 추가 예

var defaultNumber = 273;

defaultNumber.method = function() {
    return 'Default Method';
};

var output = defaultNumber.method() + '\n';
console.log(output); // TypeError

위 코드를 실행하면 오류가 발생합니다. 기본 자료형이기 때문에 속성과 메서드를 추가해서 사용할 수 없습니다.

기본 자료형을 객체로 변환하는 것은 일회용 옷을 입는다는 개념으로 생각하면 쉽습니다. 기본 자료형의 메서드를 사용한다는 것은 기본 자료형에 객체라는 일회용 옷을 입힌 다음 메서드를 사요하는 것입니다. 한 번 사용하면 곧바로 일회용 옷을 버립니다. 기본 자료형에 메서드를 추가했지만 이는 기본 자료형에 직접 메서드를 추가한 것이 아니라 일회용 옷에 추가한 것이므로 추가하자마자 버령집니다.

 

생성자 함수에 메서드 추가 예

var defaultNumber = 273;
var objectNumber = new Number(273);

Number.prototype.method = function() {
    return 'Method on Prototype';
};

var output = '';
output += defaultNumber.method() + '\n';
output += objectNumber.method();

console.log(output);
/*
Method on Prototype
Method on Prototype
*/

프로토타입에 메서드를 추가하면 위 코드처럼 기본 자료형에도 새로운 메서드가 생성됩니다.

반응형
반응형

문제

다음과 같은 객체를 생성할 수 있는 생성자 함수를 예로 들어보세요. ( 생성자 함수 이름은 Product, 키와 자료형은 적절하게 사용합니다. )

속성
이름 돼지삼겹살
무게 100g
가격 1690원
메서드 설명
calculate(무게) 무게를 기반으로 가격을 계산합니다.

 

힌트

product.calculate(200)이라고 입력하면 100g * 2 = 200g이므로 3380원을 출력하면 됩니다.

function Product(name, weight, price) {
    this.name = name;
    this.weight = weight;
    this.price = price;

    // 메서드
    this.calculate = function(weight) {
        return this.price * (weight / this.weight);
    }
}

var product = new Product("돼지고기", 100, 1690);

console.log(product.calculate(200)); // 3380

 

반응형
반응형

클래스

 

클래스 선언과 속성

클래스는 아래 코드와 같은 형태로 선언됩니다. 속성도 this키워드를 사용해 선언합니다.

 

클래스 선언 예

// 클래스 선언
class Rectangle {
    constructor(width, height) {
        this.width = width;
        this.height = height;
    }
}

const rectangle = new Rectangle(100, 200);

 

// 생성자 함수 선언
function Rectangle(width, height) {
    this.width = width;
    this.height = height;
}
var rectangle = new Rectangle(100, 200);

 

메서드 선언 예

// 클래스 메서드 선언
class Rectangle1 {
    constructor(width, height) {
        this.width = width;
        this.height = height;
    }

    getArea() {
        return this.width * this.height;
    }
}

const rectangle1 = new Rectangle1(100, 200);

console.log(rectangle1.getArea());
// 생성자 함수 메서드 선언
function Rectangle2(width, height) {
    this.width = width;
    this.height = height;
}

Rectangle2.prototype.getArea = function() {
    return this.width * this.height;
}

var rectangle2 = new Rectangle2(100, 200);

console.log(rectangle2.getArea());

클래스의 메서드는 프로토타입 안에 선언하는 것이 아니라 클래스 안에 선언하게 됩니다. 선언 방법은 똑같습니다.

 

게터와 세터 예

class Rectangle1 {
    constructor(width, height) {
        this._width = width;
        this._height = height;
    }
    get width() {
        return this._width;
    }
    set width(input) {
        this._height = input;
    }
    get height() {
        return this._height;
    }
    set height(input) {
        this._width = input;
    }
    getArea() {
        return this._width * this._height;
    }
}

const rectangle1 = new Rectangle1(100, 200);
rectangle1.width = 200;

console.log(rectangle1.width); // 100
console.log(rectangle1.getArea()); // 20000

ECMAScript 6의 클래스는 변수를 숨길 수 없습니다. 그래서 일반적으로 개발한 사람 이외에는 만지지 말아 달라는 의미에서 _를 붙입니다. 그래서 외부에서 만지지 말라는 의미로 width와 height에 _를 붙여서 선언했습니다.

게터와 세터는 메서드를 선언할 때 앞에 get or set을 붙여 선언합니다.

get을 붙여 만든 메서드는 rectangle.width처럼 값을 가져오는 행위를 할 때 자동으로 호출되며, set을 붙여 만든 메서드는 rectangle.width = 200처럼 값을 넣는 행위를 할 때 자동으로 호출됩니다.

상속

상속은 extends키워드로 구현합니다.

 

상속 예

class Rectangle1 {
    constructor(width, height) {
        this._width = width;
        this._height = height;
    }
    get width() {
        return this._width;
    }
    set width(input) {
        this._height = input;
    }
    get height() {
        return this._height;
    }
    set height(input) {
        this._width = input;
    }
    getArea() {
        return this._width * this._height;
    }
}

class Square extends Rectangle1 {
    // 생성자
    constructor(length) {
        // 부모의 생성자 (constructor 메서드)를 호출합니다.
        super(length, length);
        console.log(this) // _width: 100, _height: 100
    }
    // width 또는 height를 변경하면 둘 다 변경되도록 재선언 합니다.
    set width(input) {
        this._width = input;
        this._height = input;
    }
    set height(input) {
        this._width = input;
        this._height = input;
    }
}

const square = new Square(100);
console.log(square.getArea()); // 10000

 

반응형

'JavaScript | TypeScript > Javascript 시작하기' 카테고리의 다른 글

[ Javascript ] Object 객체  (1) 2022.06.16
[ Javascript ] 기본 내장 객체  (0) 2022.06.15
[ Javascript ] 상속  (0) 2022.06.14
[ Javascript ] 캡슐화  (0) 2022.06.14
[ Javascript ] 프로토타입  (0) 2022.06.13
반응형

문제

수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려고 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다.

1번 수포자 : 1,2,3,4,5,1,2,3,4,5,...

2번 수포자 : 2,1,2,3,2,4,2,5,2,1,2,3,2,4,2,5,...

3번 수포자 : 3,3,1,1,2,2,4,4,5,5,3,3,1,1,2,2,...

 

1번 문제부터 마지막 문제까지의 정답이 순서대로 들은 배열 answers가 주어졌을 때, 가장 많이 문제를 맞힌 사람이 누구인지 배열에 담아 return하도록 solution함수를 작성해주세요.

 

힌트

  • 시험은 최대 10,000문제로 구성되어있습니다.
  • 문제의 정답은 1,2,3,4,5중 하나입니다.
  • 가장 높은 점수를 받은 사람이 여럿일 경우, return하는 값을 오른차순으로 정렬해주세요.
입출력
answers return
[1, 2, 3, 4, 5];
[1]
[1, 3, 2, 4, 2];
[1, 2, 3]

 

방식

// let answers = [1, 2, 3, 4, 5];
let answers = [1, 3, 2, 4, 2];

function Solution(answers) {
    answer = [];

    let a = [1, 2, 3, 4, 5], b = [2, 1, 2, 3, 2, 4, 2, 5], c = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5, 3, 3], points = [0, 0, 0];

    for(let i = 0; i < answers.length; i++) {
        if(a[i] === answers[i]) {
            points[0]++;
        }
        if(b[i] === answers[i]) {
            points[1]++;
        }
        if(c[i] === answers[i]) {
            points[2]++;
        }
    }

    let lv = 0;

    for(let j = 0; j < points.length; j++) {
        if(points[j] > lv) {
            lv = points[j];
        }
    }

    for(let k = 0; k < points.length; k++) {
        if(lv === points[k]) {
            answer.push(k + 1);
        }
    }
    return answer;
}

let solution = new Solution(answers);

console.log(solution); // 1, 2, 3

수포자를 a, b, c배열로 선언하고 문제를 맞추는 각 수포자들에게 points에 점수를 추가해줍니다.

lv변수를 추가하고 for반복문을 통해 가장 많이 맞춘 갯수를 저장하고, 한번더 for반복문을 통해서 가장 많이 맞춘 갯수와 같은지 비교를 하고, 같다면 answer배열에 푸시를 해주고 answer배열을 리턴시켜줍니다.

반응형
반응형

문제

많은 마라톤 선수들이 마라톤에 참여했습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.

마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return하도록 solution함수를 작성해주세요.

 

힌트

  • 마라톤 경기에 참여한 선수는 1명 이상 100,000명 이하입니다.
  • completion의 길이는 participant의 길이보다 1 작습니다.
  • 참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다.
  • 참가자 중에는 동명이인이 있을 수 있습니다.
입출력
participant completion return
["leo", "kiki", "eden"]
["eden", "kiki"]
["leo"]
["marina", "josipa", "nikola", "vinko", "filipa"]
["josipa", "nikola", "marina", "filipa"]
["vinko"]
["mislav", "stanko", "mislav", "ana"]
["mislav", "stanko", "ana"]
["mislav"]

 

방식 [ 단순 for 반복문 ]

var participant = ["leo", "kiki", "eden"];
var completion = ["eden", "kiki"];

function Solution(participant, completion) {
    participant.sort();
    completion.sort();

    output = '';
    for(let i = 0; i < participant.length; i++) {
        if(participant[i] !== completion[i]) {
            output += participant[i];
        }
    }
    return output;
}

var solution = new Solution(participant, completion);

console.log(output); // leo

 

방식 2 [ for in 반복문 ]

var participant = ["leo", "kiki", "eden"];
var completion = ["eden", "kiki"];

function Solution(participant, completion) {
    participant.sort();
    completion.sort();

    output = '';
    for(let i in participant) {
        if(participant[i] !== completion[i]) {
            output += participant[i];
            return output;
        }
    }
}

var solution = new Solution(participant, completion);

console.log(output); // leo

 


 

두명 이상의 선수가 완주하지 못했을 때 [ 중첩 for문 ] [ 중복검사 안되는 형태 ]

var participant = ["marina", "josipa", "nikola", "vinko", "filipa", "helll"];
var completion = ["josipa", "nikola", "marina", "filipa"];

function Solution(participant, completion) {

    output = '';

    for(let i = 0; i < participant.length; i++) {
        let count = 0;

        for(let j = 0; j < completion.length; j++) {
            if(participant[i] === completion[j]) {
                console.log(participant[i]);
            } else {
                count ++;

                if(completion.length === count) {
                    output += participant[i] + ' ';
                }
            }
        }
    }
    return output;
}

var solution = new Solution(participant, completion);

console.log(output); // vinko helll

 

반응형
반응형

상속

상속은 기존의 생성자 함수나 객체를 기반으로 새로운 생성자 함수나 객체를 쉽게 만드는 것을 뜻합니다.

기존의 객체를 기반으로 생성하기 때문에 상속으로 새로 만들어지는 객체에는 기존 객체의 특성이 모두 있습니다. 이를 기존의 객체에서 유산(속성과 메서드)을 물려받는 것과 비슷하다고 하여 상속이라는 이름을 사용합니다.

 

생성자 함수 Square 선언 예

function Square(length) {
    this.width = length;
    this.height = length;
}

Square.prototype.getArea = function() {
    return this.getWidth() * this.getHeight();
};

위 코드를 캡슐화하고 싶지만 비슷한 코드를 만들때마다 캡슐화를 진행한다면 코드가 너무 복잡해집니다.

이럴때 바로 상속을 이용합니다.

 

상속 예

function Rectangle(w, h) {
    var width = w;
    var height = h;

    // 메서드
    this.getWidth = function() { return width; };
    this.getHeight = function() { return height; };
    this.setWidth = function(w) {
        if(w < 0) {
            throw '음수'
        } else {
            width = w;
        }
    };
    this.setHeight = function(h) {
        if(h < 0) {
            throw '음수'
        } else {
            height = h;
        }
    };
}

Rectangle.prototype.getArea = function() {
    return this.getWidth() * this.getHeight();
};

var rectangle = new Rectangle(5, 7);

rectangle.setWidth(Number(prompt('가로길이 입력')));
rectangle.setHeight(Number(prompt('세로길이 입력')));

console.log("Area: " + rectangle.getArea());

// 상속
function Square(length) {
    this.base = Rectangle;
    this.base(length, length);
}
Square.prototype = Rectangle.prototype;
Square.prototype.constructor = Square;

// var square = new Square(5);

var square = new Square(Number(prompt('값 입력')));
console.log(square.getArea());

// 상속 확인하기
console.log(square instanceof Rectangle); // true

생성자 함수 Square내부에서 작성한 것은 base 속성에 생성자 함수 Rectangle을 넣고 실행한 것과 생성자 함수 Square의 프로토타입에 Rectangle의 프로토타입을 넣은 것 두가지 입니다. 전자를 사용해서 Rectangle객체의 속성을 Square객체에 추가했으며, 후자를 사용해 Rectangle객체의 프로토타입이 가진 속성 또는 메서드를 Square객체의 프로토타입에 복사했습니다. 

 

참고로 생성자 함수 Square의 프로토타입 constructor()메서드에 Square를 다시 넣는 부분이 없어도 정상작동을 합니다.

하지만 직접 square객체의 constructor()메서드를 출력해보면, 생성자 함수 Square가 아니라 생성자 함수 Rectangle을 가리킵니다. 따라서 프로토타입의 생성자 함수를 재정의한 것입니다.

 

여러 곳에서 활용되므로, 자식이 부모의 속성과 메서드를 물려받는 것이라고 알고 넘어가줍니다.

 

반응형

'JavaScript | TypeScript > Javascript 시작하기' 카테고리의 다른 글

[ Javascript ] 기본 내장 객체  (0) 2022.06.15
[ Javascript ] 클래스  (0) 2022.06.15
[ Javascript ] 캡슐화  (0) 2022.06.14
[ Javascript ] 프로토타입  (0) 2022.06.13
[ Javascript ] 생성자 함수  (0) 2022.06.13

+ Recent posts