연산자 기호는 공통적으로 사용되는 사칙연산을 적용하고 있다.

그 밖에 추가로 사용되는 연산자 중 차이점을 정리한다.

 

비교 연산자

동등 연산자와 일치 연산자

true == 1;
// true , 두 피연산자를 비교하기 전에 true를 1로 변환
true === 1;
// false , 두 피연산자의 타입부터 비교된다.

 

비슷해 보이는 두 연산자의 동일한 값 비교에서 명확한 차이가 난다.

 

 

'==' 동등 연산자

비교하는 두 값의 타입이 다르면 비교하기 전에 타입을 동일하게 변환 후 비교를 한다.

console.log(5 == '5');      // true, 숫자 5와 문자열 '5'가 타입 강제 변환 후 비교
console.log(null == undefined); // true, 둘 다 비어있는 값을 나타냄
console.log(0 == false);    // true, 숫자 0과 불리언 false가 타입 강제 변환 후 비교
console.log('' == false);   // true, 빈 문자열과 불리언 false가 타입 강제 변환 후 비교

 

'===' 일치 연산자

타입과 값이 모두 동일해야만 참을 반환한다.

console.log(5 === '5');     // false, 타입이 다르므로 일치하지 않음
console.log(null === undefined); // false, 타입이 다르므로 일치하지 않음
console.log(0 === false);   // false, 타입이 다르므로 일치하지 않음
console.log('' === false);  // false, 타입이 다르므로 일치하지 않음
console.log(5 === 5);       // true, 타입과 값이 모두 동일

 

타입 강제 변환의 수행 때문에 예기치 않은 결과를 발생시킬 수 있다. 따라서 자바스크립트에서는 일관성과 예측 가능한 동작을 위해 일반적으로 '==='를 사용하는 것이 권장된다.

 

<, > 등호 

숫자뿐만 아니라 문자열과 객체도 비교가 가능하다. 

console.log(5 < 10);   // true
console.log(5 > 10);   // false
console.log(10 > 10);  // false
console.log(10 < 10);  // false
console.log(10 <= 10); // true
console.log(10 >= 10); // true

 

 

문자열 비교는 유니코드 값을 기준으로 문자열을 비교한다.

console.log('apple' < 'banana');   // true
console.log('grape' > 'banana');   // true
console.log('apple' > 'Apple');    // true ('a'의 유니코드 값이 'A'보다 큼)
console.log('2' < '10');           // false (문자열 비교에서 '2'는 '10'보다 큼)

 

객체의 경우 직접 등호를 사용해서 비교할 수 없지만 비교 시 객체를 원시 값으로 변환하려고 시도한다. 이 경우 두 객체의 참조를 비교한다. 일반적으로 객체의 비교는 특정 속성을 비교하는 방법으로 사용한다.

// 객체 직접 비교시
let obj1 = { value: 10 };
let obj2 = { value: 20 };

console.log(obj1 < obj2); // false
console.log(obj1 > obj2); // false
console.log(obj1 == obj2); // false

// 객체의 속성 비교
let obj1 = { value: 10 };
let obj2 = { value: 20 };

console.log(obj1.value < obj2.value); // true

 

숫자와 문자열간의 비교도 가능하며 이 경우 자동으로 타입을 변환하여 비교한다.

console.log('5' < 10);  // true (문자열 '5'는 숫자 5로 변환됨)
console.log('5' > 10);  // false
console.log('5' > '10'); // true ('5'와 '10'은 문자열로 비교됨, '5'는 '10'보다 큼)

 

in 연산자

객체의 속성이나 배열의 인덱스가 존재하는지 확인하는 데 사용된다.

 

객체의 특정 속성이 존재하는지 확인할 때

let person = {
  name: "Alice",
  age: 30
};

console.log("name" in person); // true
console.log("age" in person);  // true
console.log("gender" in person); // false

 

배열의 특정 인덱스가 존재하는지 확인할 때

let numbers = [10, 20, 30];

console.log(0 in numbers); // true
console.log(1 in numbers); // true
console.log(3 in numbers); // false (인덱스 3은 존재하지 않음)

 

in 연산자는 주어진 속성 또는 인덱스가 객체의 자체 속성인지, 프로토타입 체인에 속한 속성인지 여부를 검사한다.

let person = {
  name: "Alice"
};

console.log("toString" in person); // true, toString은 Object.prototype의 속성

 

toString은 person 객체에 직접 정의된 속성이 아니지만 Object.protorype에 정의된 속성이기 때문에 in 연산자는 true를 반환한다.

 

객체의 자체 속성만을 검사하려면 Object.hasOwnProperty 메서드를 사용한다.

let person = {
  name: "Alice"
};

console.log(person.hasOwnProperty("name")); // true
console.log(person.hasOwnProperty("toString")); // false

 

instanceof 연산자

특정 객체가 특정 생상저 함수 또는 클래스의 인스턴스인지 확인하는 데 사용된다. 이를 통해 객체의 프로토타입 체인을 검사하여 객체가 특정 생성자 함수의 프로토타입을 상속받았는지 여부를 확인할 수 있다.

object instanceof Constructor

 

여기서 object는 검사할 객체, Constructor는 생성자 함수이다.

 

원시 타입인 숫자, 문자열, 불리언 등에는 사용할 수 없다.

console.log(5 instanceof Number); // false
console.log("hello" instanceof String); // false

 

instanceof 연산자는 객체의 프로토타입 체인을 따라가면서 주어진 생성자 함수의 prototype 속성과 일치하는 프로토타입이 있는지 검사한다. 이 과정은 객체의 프로토타입 체인 끝에 도달할 때까지 계속된다.

 

function Foo() {}
function Bar() {}

let foo = new Foo();

console.log(foo instanceof Foo); // true
console.log(foo instanceof Bar); // false
console.log(foo instanceof Object); // true (Foo의 인스턴스는 Object의 인스턴스이기도 함)

 

따라서 객체의 프로토타입이 동적으로 변경된다면 instanceof의 결과도 달라질 수 있게 된다.

function Foo() {}
function Bar() {}

let obj = new Foo();
console.log(obj instanceof Foo); // true

Object.setPrototypeOf(obj, Bar.prototype);
console.log(obj instanceof Foo); // false
console.log(obj instanceof Bar); // true

 

typeof 연산자

typeof 연산자는 데이터 타입을 검사하는 데 사용되며 주로 원시 타입을 검사할 때 사용한다.

console.log(typeof 5);          // "number"
console.log(typeof "hello");    // "string"
console.log(typeof true);       // "boolean"
console.log(typeof {});         // "object"
console.log(typeof []);         // "object"
console.log(typeof function(){}); // "function"

 

논리 연산자

논리적인 조건을 평가하거나 결합하는 데 사용된다. 주로 조건문에서 사용되며 참 또는 거짓 값을 반환한다.

 

&& AND

두 피연산자가 모두 참일 때 참, 하나라도 거짓이면 거짓을 반환한다.

console.log(true && true);   // true
console.log(true && false);  // false
console.log(false && true);  // false
console.log(false && false); // false

let a = 5;
let b = 10;
console.log(a > 0 && b > 0); // true (a와 b가 모두 0보다 큼)

 

|| OR

두 피연산자 중 하나라도 참이면 참, 둘 다 거짓일 때만 거짓을 반환한다.

console.log(true || true);   // true
console.log(true || false);  // true
console.log(false || true);  // true
console.log(false || false); // false

let a = 5;
let b = -10;
console.log(a > 0 || b > 0); // true (a가 0보다 큼)

 

! NOT

피연산자의 부정을 반환한다. 참이면 거짓, 거짓이면 참을 반환한다.

console.log(!true);  // false
console.log(!false); // true

let a = 5;
console.log(!(a > 0)); // false (a > 0은 true이므로, !true는 false)

 

 

논리 연산자의 단축 평가 (Short-Circuit Evaluation)

논리 연산자는 단축 평가를 사용하여 불필요한 연산을 피한다. 이는 첫 번째 피연산자가 전체 표현식의 결과를 결정할 수 있는 경우 두 번째 피연산자를 평가하지 않는다는 것을 의미한다.

 

&&, 첫 번째 연산자가 거짓이면 두 번째 피연산자를 평가하지 않는다.

console.log(false && true);  // false (두 번째 피연산자를 평가하지 않음)
console.log(true && false);  // false
console.log(false && false); // false (두 번째 피연산자를 평가하지 않음)
console.log(true && true);   // true

let a = 5;
let b = 10;
console.log(a > 0 && b > 0 && b > a); // true (모든 조건이 참)

 

||, 첫 번째 피연산자가 참이면 두 번째 피연산자를 평가하지 않는다.

console.log(true || false);  // true (두 번째 피연산자를 평가하지 않음)
console.log(false || true);  // true
console.log(true || true);   // true (두 번째 피연산자를 평가하지 않음)
console.log(false || false); // false

let a = 5;
let b = -10;
console.log(a > 0 || b > 0 || b < a); // true (첫 번째 조건이 참이므로 나머지 조건을 평가하지 않음)

 

delete 연산자

객체의 속성을 삭제하는 데 사용된다. 주로 객체의 속성만을 삭제할 때 사용한다. 

 

delete object.property;
//또는
delete object['property'];

 

객체의 특정 속성을 삭제하고 삭제된 속성은 객체에서 완전히 제거되어 더 이상 해당 속성에 접근할 수 없다.

 

let person = {
  name: "Alice",
  age: 30
};

console.log(person.age); // 30

delete person.age; // age 속성 삭제

console.log(person.age); // undefined (삭제된 속성에 접근 시)
console.log(person); // { name: "Alice" }

 

배열의 요소 삭제

배열의 요소를 삭제할 수 있지만 배열의 길이는 변경되지 않고 해당 인덱스는 undefined로 남아 있게 되므로 완전히 제거하고 길이를 줄이기 위해서는 splice 메서드를 사용하는 것이 좋다.

 

let numbers = [1, 2, 3, 4];

delete numbers[2]; // 배열의 세 번째 요소 삭제

console.log(numbers); // [1, 2, undefined, 4]
console.log(numbers.length); // 4 (배열 길이는 그대로)

 

프로토타입 속성 삭제

객체의 프로토타입에 정의된 속성은 delete 연산자로 삭제할 수 없다.

 

function Person(name) {
  this.name = name;
}

Person.prototype.age = 30;

let alice = new Person("Alice");

console.log(alice.age); // 30 (프로토타입 속성)

delete alice.age; // 인스턴스의 age 속성 삭제 시도 (실제로 프로토타입의 속성은 삭제되지 않음)

console.log(alice.age); // 30 (프로토타입의 속성은 여전히 존재)

 

변수 삭제

전역 변수와 함수의 경우 delete 연산자를 사용해도 삭제되지 않는다. 지역 변수는 delete로 삭제할 수 없다.

 

 

728x90
반응형

'Program Language > JavaScript' 카테고리의 다른 글

JavaScript #6 호이스팅(Hoisting)  (0) 2024.07.21
JavaScript #5 유효 범위, 스코프(Scope)  (0) 2024.07.21
JavaScript #4 변수  (1) 2024.07.21
JavaScript #2 표현식  (0) 2024.07.21
JavaScript #1 개요  (0) 2024.07.21

표현식은 코드에서 값으로 평가될 수 있는 코드의 조각이라고 말할 수 있다.

표현식의 결과는 값이 될 수 있으며, 이를 통해 값을 할당하거나 다른 표현식의 일부로 사용할 수 있다.

 

표현식을 파악하면 자바스크립트의 문법이 어떤 코드의 조각들로 작성되어서 변수의 값이 할당되고 조건문 및 반복문 등이 구성되고 함수의 인수로 전달되는지 알 수 있다.

 

표현식 종류

리터럴 표현식

고정된 값을 나타낸다.

가장 간단한 형태로 다른 표현식을 포함하지 않는 독립적인 표현식이다.

1; // 숫자 리터럴
"hello" // 문자열 리터럴
true; //boolean 리터럴
[1,2,3]; // 배열 리터럴
{key:"value"}; // 객체 리터럴

 

식별자 표현식

변수나 상수의 이름을 나타낸다.

let x = 10;
x; // 식별자 표현식 값 : 10

 

 

연산자 표현식

연산자를 사용하여 값을 생성한다.

5 + 5;
x * 2;
y > 5;

 

함수 호출 표현식

함수를 호출하여 값을 생성한다.

function add(a, b){
	return a + b;
}
add(3, 4); // 함수 호출 표현식, 값 : 7

 

객체 프로퍼티 접근 표현식

프로퍼티에 접근하는 표현식이다.

let person = { name : "Bak", age: 25};
person.name; // 객체 프로퍼티 접근 표현식, 값 : "Bak"

 

산술 표현식

let a = 5;
let b = 10;
let sum = a + b; // 값 15

수로 변환 불가능한 피연산자인 경우 NaN(Not-a-Number) 값으로 변환되며 피연산자 중 하나라도 NaN일 경우 연산 결과는 NaN이 된다.

 

비교 표현식

let isEqual = (a === b);

 

논리 표현식

let isAdult = (age >= 25 && age < 100);

 

삼항 표현식

let access = (age >= 18) ? "Adult" : "None";

 

표현식 사용

변수 할당

let result = 5 + 10; // 연산자 표현식을 사용하여 result에 값 할당

 

조건문

let age = 25;
if (age >= 25) { // 비교 연산자 표현식을 사용한 조건문
	console.log("Bakcdoing's Blog");
}

 

함수 인수

fuction greet(name){
	console.log("Hello, " + name);
}
greet("Bak"); // 문자열 리터럴을 함수 인수로 사용
728x90
반응형

'Program Language > JavaScript' 카테고리의 다른 글

JavaScript #6 호이스팅(Hoisting)  (0) 2024.07.21
JavaScript #5 유효 범위, 스코프(Scope)  (0) 2024.07.21
JavaScript #4 변수  (1) 2024.07.21
JavaScript #3 연산자  (1) 2024.07.21
JavaScript #1 개요  (0) 2024.07.21

JavaScript

자바스크립트는 현재까지도 웹 개발에서는 빼놓을 수 없는 필수적인 기술이다. 더 나아가 이제는 웹뿐만 아니라 서버 개발에서도 사용할 정도로 높은 유연성과 확장성을 가진 언어로 평가된다.

 

탄생

1995년, 웹은 주로 정적인 페이지로 구성되어 있었고 이러한 페이지는 사용자가 상호작용할 수 있는 기능이 매우 제한적이었으며 또한 모든 상호작용은 서버와의 통신을 통해 이루어졌기 때문에 느리고 비효율적인 방식이었다.

 

당시 웹 브라우저 시장을 주도했던 미국의 소프트웨어 회사인 넷스케이프(Netscape Communications Corporation)는 이러한 문제점을 해결하고 사용자와 웹 페이지의 상호작용을 개선하기 위해서 클라이언트 측에서 실행될 수 있는 스크립팅 언어가 필요하다고 판단하였다. 

넷스케이프

 

넷스케이프의 CTO였던 마크 앤드리슨(Marc Andreessen)은 프로그래밍 언어 설계와 컴파일러 개발에 경험이 있던 브렌던 아이크(Brendan Eich)를 고용했으며 그의 풍부한 경험을 바탕으로 아주 짧은 기간인 10일 만에 넷스케이프의 요구를 충족하는 스크립팅 언어를 개발했고 그 초기 버전은 '모카(Mocha)'라는 이름이었다.

 

좌) 마크 앤드리슨 우) 브렌던 아이크

 

모카는 이후 개발과 사업적인 과정을 거치면서 '라이브스크립트(LiveScript)'로 바뀌었고 최종적으로는 자바스크립트(JavaScript)로 알려지게 되었다.

 

당시 넷스케이프와 경쟁 관계였던 마이크로소프트(Microsoft)는 자바스크립트와의 경쟁을 위해 자사의 브라우저인 인터넷 익스플로러 3.0에 자바스크립트의 변형인 JScript를 도입하면서 두 웹 브라우저 간의 경쟁이 치열해졌다. 그 밖에도 여러 브라우저들이 있었으며 하나의 브라우저에 맞춰서 작업을 하면 다른 브라우저에서는 제대로 동작하지 않는 경우가 빈번하게 발생하였고 이는 웹 개발자들에게 큰 불편을 초래하여 웹의 발전을 저해하는 요인이 되었다.

 

자바스크립트 표준화

이러한 호환성 문제를 해결하기 위해서 자바스크립트를 표준화하려는 노력이 시작되었다.

1996년 넷스케이프는 유럽 컴퓨터 제조업체 협회(ECMA)에 자바스크립트의 표준화를 제안하였고 ECMA는 자바스크립트를 표준화하기 위한 기술 위원회를 구성하였다. 

 

그리고 1997년 자바스크립트의 표준 사양인 ECMA-262를 발표했다. ECMAAScript로 알려진 이 표준은 자바스크립트와 JScript 간의 차이를 최소화하고, 두 브라우저 간의 호환성을 개선하는데 목적이 있었다. 이후에도 표준화 작업은 지속적으로 이루어져 자바스크립트의 공식 표준으로 웹 개발의 핵심을 이루었으며 최신버전인 2015년 ES6까지 이어지고 있다.

 

발전

자바스크립트는 동적 언어의 패러다임을 가지고 있으며 발전 과정에서도 그 틀은 바뀌지 않았다. 웹 페이지는 발전할 수 록 더 복잡해져 갔고 여기서 발생되는 가장 큰 불편은 데이터를 갱신할 때마다 서버로부터 새로 데이터를 가져오면서 발생하는 새로고침으로 웹 페이지의 데이터가 많을수록 점점 더 느려져갔다.

 

1999년 마이크로소프는 인터넷 익스플로러 5.0에서 XMLHttpRequest 객체를 도입하기 시작했다. 이 객체는 자바스크립트를 사용하여 서버와 비동기적으로 통신할 수 있게 해 주었다.

 

이 객체의 도입으로 사용자의 요청마다 전체 페이지를 새로 고침 해야 하는 페이지 리로드 문제, 새로 고침으로 인해 서버 응답 시간과 페이지 렌더링으로 인해 시간이 필요한 느린 반응 속도 문제 그리고 매번 전체 페이지를 새로 고침 하면서 서버에 불필요한 요청을 증가시켜 서버 부하를 높이던 문제를 해결할 수 있게 되었다.

 

또한 이제 동적으로 콘텐츠를 업데이트하는 것이 가능해졌기 때문에 XMLHttpRequest의 등장 이후로 사용자의 경험은 크게 향상되었다. 초기에는 이 기능이 주로 마이크로소프트의 ActiveX 기술을 통해 제공되었지만, 이후 다른 브라우저에서도 이 기능을 채택하게 되었다.

 

더 나아가서 비동기적 웹 기술의 발전은 2005년 제시 제임스 가렛(Jesse James Garrett)에 의해서 AJAX(Asynchronous JavaScript and XML), 자바스크립트를 사용하여 서버와 비동기적으로 통신하는 기술에 대한 개념을 정립하였다.

제시 제임스 가렛

 

이후로 더 상호적이고 반응성이 뛰어난 웹 애플리케이션들이 만들어지게 되었고 현재까지도 이 기술은 일반적으로 사용되는 개념이 되었다.

 

용도와 중요성

자바스크립트는 기본적으로 웹 페이지에 동적인 기능을 추가하는 역할을 한다. 따라서 웹 개발에서는 필수적으로 요구된 되는 기술로 반드시 학습하는 것이 좋다.

 

현재는 웹뿐만 아니라 기술이 확장되어서 Node.js와 같은 런타임 환경을 통해서 서버 측 개발에서도 널리 사용되고 있다. 이를 통해 백엔드 로직을 작성하고 데이터베이스와 상호작용하는 것도 가능하다.

 

또한 React Native와 같은 프레임워크를 통해 네이티브 모바일 애플리케이션을 개발하거나 Phaser와 같은 라이브러리로 2D 나 3D 게임까지도 만들 수 있다.

 

특징

자바스크립트의 가장 큰 언어는 동적언어라는 점이다.

 

동적언어란, 런타임 시에 다양한 동작을 수행할 수 있는 프로그래밍 언어를 말한다. 이러한 자바스크립트의 특징은 사용자와 실시간으로 다양한 상호작용을 주고받을 필요가 있는 웹 페이지에 적합하다.

 

동적 언어의 특징

동적 타입 바인딩

변수의 타입이 런타임에 결정된다. 즉, 변수를 선언할 때 특정 타입을 지정할 필요가 없으며, 실행 중에 할당된 값에 따라 타입이 변경될 수 있다.

 

만약 C, C++, Java 같은 정적 언어인 경우

int num = 1;
string name = "bak";

컴파일 타임에 타입을 확인하기 때문에 타입으로 인한 런타임 오류를 방지할 수 있으며 명시적으로 지정했기 때문에 코드의 가독성이 좋지만 그만큼 매번 타입을 지정해야 하는 번거로움이 있다는 특징이 있다.

 

반대로 동적언어인 JavaScript, Ruby, Python의 경우

var num = 1;
num = true;
num = "Hello";

런타임에서 타입이 결정될 수 있다. 따라서 매번 타입을 변경할 필요가 없기 때문에 var 변수를 사용해 모든 변수 선언이 가능하다. 이미 선언된 변수도 이후에 다른 타입을 값을 저장하는 것 또한 문제가 발생하지 않는다. 

 

동적언어와 비교했을 때 상대적으로 타입과 관련한 코드와 규칙이 적기 때문에 코드가 짧고 배우기가 쉽지만 실행 중 타입에러가 발생할 수 있는 문제도 존재한다.

추가적으로 C++의 auto 타입이 var와 비슷하기 때문에 동적인 특징이 있어 보이지만 auto 타입은 컴파일 단계에서 타입이 추론되기 때문에 런타임에서는 이미 타입이 확정된 상태이다.

 

인터프리터

자바스크립트는 기본적으로 인터프리터로 방식으로 실행된다. 현대에 들어서는 JIT(Just In Time) 컴파일을 활용하여 성능을 향상시기키도 했다. 

 

인터프리터 방식이란 코드를 한 줄씩 읽고 실행하는 방식으로 개발 중 빠른 피드백을 제공하고 동적 특성을 잘 처리할 수 있지만 성능 면에서 제한이 있었다. 이러한 문제점을 JIT 컴파일을 통해서 보완하여 사용 중이다.

728x90
반응형

'Program Language > JavaScript' 카테고리의 다른 글

JavaScript #6 호이스팅(Hoisting)  (0) 2024.07.21
JavaScript #5 유효 범위, 스코프(Scope)  (0) 2024.07.21
JavaScript #4 변수  (1) 2024.07.21
JavaScript #3 연산자  (1) 2024.07.21
JavaScript #2 표현식  (0) 2024.07.21

11번 "꼬마 정민"

문제

꼬마 정민이는 이제 A + B 정도는 쉽게 계산할 수 있다. 이제 A + B + C를 계산할 차례이다!

 

입력

첫 번째 줄에 A, B, C (1 ≤ A, B, C ≤ 10^12)이 공백을 사이에 두고 주어진다.

 

출력

A+B+C의 값을 출력한다.

 

C++

#include <iostream>
using namespace std;
int main(){
    long long a,b,c;
    cin >> a;
    cin >> b;
    cin >> c;
    cout << a+b+c;
    return 0;
}

 

int 타입은 최대 - 2^31 ~ 2^31−1까지의 정수를 저장할 수 있는데 입력받을 수 있는 수의 범위는 10^12이므로 이를 저장할 수 있는 long long 타입을 사용한다. (long long은 -2^63 ~ 2^63 −1까지)

 

C#

using System;
class Program{
    static void Main(string[] args){
        string str = Console.ReadLine();
        string[] arr = str.Split(" ");
        long a = long.Parse(arr[0]);
        long b = long.Parse(arr[1]);
        long c = long.Parse(arr[2]);
        Console.WriteLine(a+b+c);
    }
}

 

C#의 int 범위는 - 2^31  ~ 2^31-1, long 범위는 -2^31 ~ 2^31-1이다

 

Python

str = input()
arr = str.split(' ')
a = int(arr[0])
b = int(arr[1])
c = int(arr[2])
print(a+b+c)

 

파이썬의 경우 int는 임의 정밀도로 정해진 범위가 없고 사용할 수 있는 만큼 값을 가질 수 있다.

 

12번 "고양이"

\, ' 등의 문자에 주의하며 고양이를 출력하는 문제

 

문제

아래 예제와 같이 고양이를 출력하시오.

 

입력

없음.

 

출력
고양이를 출력한다.

\    /\
 )  ( ')
(  /  )
 \(__)|

 

예제의 고양이와 동일하게 출력을 하면 되는 문제이다.

 

C++

#include <iostream>
using namespace std;
int main(){
    cout << "\\    /\\" << endl;
    cout << " )  ( \')" << endl;
    cout << "(  /  ) " << endl;
    cout << " \\(__)|" << endl;
    return 0;
}

 

백슬래시(\), 작은따옴표('), 큰 따옴표(") 등의 문자는 문자열 내에서 별도의 기능을 가질 수 있는 문자들은 문자 자체로 사용하기 위해서는 앞에 백슬래시를 추가해서 이스케이프 시퀀스를 사용해야 한다.

 

C#

using System;
class Program{
    static void Main(string[] args){
        Console.WriteLine("\\    /\\");
        Console.WriteLine(" )  ( \')");
        Console.WriteLine("(  /  )");
        Console.WriteLine(" \\(__)|");
    }
}

 

C#도 동일하게 이스케이프 시퀀스를 사용해서 표현한다.

 

Python

print("\\    /\\")
print(" )  ( \')")
print("(  /  )")
print(" \\(__)|")

 

이스케이프 시퀀스는 여러 프로그래밍 언어에서 비슷한 목적을 가지고 사용되지만, 모든 언어에서 동일하게 사용되지는 않는다. 대부분의 경우 C 언어에서 유래한 이스케이프 표준을 따르면서 각 언어마다 고유한 확장이나 차이를 가지고 있다.

 

13번 개

", `, \ 등의 문자에 주의하며 개를 출력하는 문제

 

문제

아래 예제와 같이 개를 출력하시오.

 

입력

없음.

 

출력

개를 출력한다.

|\_/|
|q p|   /}
( 0 )"""\
|"^"`    |
||_/=\\__|

 

C++

#include <iostream>
using namespace std;
int main(){
    cout << "|\\_/|" << endl;
    cout << "|q p|   /}" << endl;
    cout << "( 0 )\"\"\"\\" << endl;
    cout << "|\"^\"`    |" << endl;
    cout << "||_/=\\\\__|" << endl;
    return 0;
}

 

 

C#

using System;
class Program{
    static void Main(string[] args){
        Console.WriteLine("|\\_/|");
        Console.WriteLine("|q p|   /}");
        Console.WriteLine("( 0 )\"\"\"\\");
        Console.WriteLine("|\"^\"`    |");
        Console.WriteLine("||_/=\\\\__|");
    }
}

 

Python

print("|\\_/|");
print("|q p|   /}");
print("( 0 )\"\"\"\\");
print("|\"^\"`    |");
print("||_/=\\\\__|");
728x90
반응형

8번 "1998년생인 내가 태국에서는 2541년생?!"

식을 직접 세워서 계산하는 문제

 

문제

ICPC Bangkok Regional에 참가하기 위해 수완나품 국제공항에 막 도착한 팀 레드시프트 일행은 눈을 믿을 수 없었다. 공항의 대형 스크린에 올해가 2562년이라고 적혀 있던 것이었다. 불교 국가인 태국은 불멸기원(佛滅紀元), 즉 석가모니가 열반한 해를 기준으로 연도를 세는 불기를 사용한다. 반면, 우리나라는 서기 연도를 사용하고 있다. 불기 연도가 주어질 때 이를 서기 연도로 바꿔 주는 프로그램을 작성하시오.

 

입력

서기 연도를 알아보고 싶은 불기 연도 y가 주어진다. (1000 ≤ y ≤ 3000)

 

출력

불기 연도를 서기 연도로 변환한 결과를 출력한다.

 

문제를 풀기 위해서는 불기와 서기의 차이에 대한 정보가 필요한데 제목에 힌트가 있다. 두 값의 차인 543의 값을 사용해서 불기를 서기로 표시할 수 있다.

 

"불기 - 543 = 서기"

 

C++

#include <iostream>
using namespace std;
int main(){
    int input;
    cin >> input;
    cout << input - 543;
}

 

C#

using System;
class Program{
    static void Main(string[] args){
        string input = Console.ReadLine();
        int val = int.Parse(input);
        Console.WriteLine(val - 543);
    }
}

 

Python

str = input()
val = int(str)
print(val - 543)

 

C#과 Python의 경우에는 입력은 문자열로만 반환되기 때문에 이를 정수계산하기 위해서는 타입 변환의 과정이 필요하다.

 

9번 "나머지"

문제

(A+B)%C는 ((A%C) + (B%C))%C 와 같을까? (A×B)%C는 ((A%C) × (B%C))%C 와 같을까? 세 수 A, B, C가 주어졌을 때, 위의 네 가지 값을 구하는 프로그램을 작성하시오.

 

입력

첫째 줄에 A, B, C가 순서대로 주어진다. (2 ≤ A, B, C ≤ 10000)

 

출력

첫째 줄에 (A+B)%C, 둘째 줄에 ((A%C) + (B%C))%C, 셋째 줄에 (A×B)%C, 넷째 줄에 ((A%C) × (B%C))%C를 출력한다.

 

C++

#include <iostream>
using namespace std;
int main(){
    int a, b, c;
    cin >> a;
    cin >> b;
    cin >> c;
    cout << (a+b)%c << endl;
    cout << ((a%c)+(b%c))%c << endl;
    cout << (a*b)%c << endl;
    cout << ((a%c)*(b%c))%c << endl;
    return 0;
}

 

C#

using System;
class Program{
    static void Main(string[] args){
        string input = Console.ReadLine();
        string[] arr = input.Split(" ");
        int a = int.Parse(arr[0]);
        int b = int.Parse(arr[1]);
        int c = int.Parse(arr[2]);
        
        Console.WriteLine((a+b)%c);
        Console.WriteLine(((a%c)+(b%c))%c);
        Console.WriteLine((a*b)%c);
        Console.WriteLine(((a%c)*(b%c))%c);
    }
}

 

Python

str = input();
arr = str.split(" ");
a = int(arr[0]);
b = int(arr[1]);
c = int(arr[2]);
print((a+b)%c);
print(((a%c)+(b%c))%c);
print((a*b)%c);
print(((a%c)*(b%c))%c);

 

이 문제는 받아쓰기만 틀리지 않고 잘하면 어려움이 없는 문제였다.

 

10번 "곱셈"

문제

(세 자리 수) × (세 자리 수)는 다음과 같은 과정을 통하여 이루어진다.

https://www.acmicpc.net/problem/2588

 

(1)과 (2)위치에 들어갈 세 자리 자연수가 주어질 때 (3), (4), (5), (6)위치에 들어갈 값을 구하는 프로그램을 작성하시오.

 

입력

첫째 줄에 (1)의 위치에 들어갈 세 자리 자연수가, 둘째 줄에 (2)의 위치에 들어갈 세 자리 자연수가 주어진다.

 

출력

첫째 줄부터 넷째 줄까지 차례대로 (3), (4), (5), (6)에 들어갈 값을 출력한다.

 

우선 입력받은 두 값을 곱셈하여 저장해 놓고 첫 번째 입력받은 값을 기준으로 하고 두 번째 입력값을 자릿수별로 잘라서 변수에 저장한다. 그리고 각 자릿수마다 기준 값과 곱한 값을 출력하고 처음 계산한 곱셈을 출력하면 될듯하다.

 

C++

#include <iostream>
#include <string>
using namespace std;
int main(){
    int val1;
    int val2;
    cin >> val1;
    cin >> val2;
    int result4 = val1*val2;
    
    string str = to_string(val2);
    int a = str[2] - '0';
    int b = str[1] - '0';
    int c = str[0] - '0';
    
    int result1 = val1*a;
    int result2 = val1*b;
    int result3 = val1*c;
    
    cout << result1 << endl;
    cout << result2 << endl;
    cout << result3 << endl;
    cout << result4 << endl;
    
    return 0;
}

 

C#

using System;
class Program{
    static void Main(string[] args){
        string str_1 = Console.ReadLine();
        string str_2 = Console.ReadLine();
        
        int val_1 = int.Parse(str_1);
        int val_2 = int.Parse(str_2);
        int a = (int)char.GetNumericValue(str_2[2]);
        int b = (int)char.GetNumericValue(str_2[1]);
        int c = (int)char.GetNumericValue(str_2[0]);
        
        int result_1 = val_1 * a;
        int result_2 = val_1 * b;
        int result_3 = val_1 * c;
        int result_4 = val_1 * val_2;
        
        Console.WriteLine(result_1);
        Console.WriteLine(result_2);
        Console.WriteLine(result_3);
        Console.WriteLine(result_4);
    }
}

 

C#에서 단일 문자의 경우 int.Parse는 에러가 발생한다. 따라서 문자를 정수로 전환하기 위해서 char.GetNumericValue를 사용한다. 

 

또는 문자가 숫자일 경우에는 아스키코드를 활용해서 정수로 변환할 수 있다.

아스키코드에서 '0' 문자는 48이다. 그리고 그 뒤로 연속으로 값이 증가하는데 즉 '1' - '0' = 49 - 48 이므로 결과는 1로 정수 값을 구할 수 있게 된다.

 

int a = (int)char.GetNumericValue(str_2[2]);
int b = (int)char.GetNumericValue(str_2[1]);
int c = (int)char.GetNumericValue(str_2[0]);

// ASCII
int a = str_2[2] - '0';
int b = str_2[1] - '0';
int c = str_2[0] - '0';

 

Python

str_1 = input()
str_2 = input()
val_1 = int(str_1)
val_2 = int(str_2)
a = int(str_2[2])
b = int(str_2[1])
c = int(str_2[0])
result_1 = val_1 * a
result_2 = val_1 * b
result_3 = val_1 * c
result_4 = val_1 * val_2
print(result_1)
print(result_2)
print(result_3)
print(result_4)
728x90
반응형

7번 사칙연산 응용

문제

준하는 사이트에 회원가입을 하다가 joonas라는 아이디가 이미 존재하는 것을 보고 놀랐다. 준하는 놀람을??!로 표현한다. 준하가 가입하려고 하는 사이트에 이미 존재하는 아이디가 주어졌을 때, 놀람을 표현하는 프로그램을 작성하시오.

 

입력

첫째 줄에 준하가 가입하려고 하는 사이트에 이미 존재하는 아이디가 주어진다. 아이디는 알파벳 소문자로만 이루어져 있으며, 길이는 50자를 넘지 않는다.

 

출력

첫째 줄에 준하의 놀람을 출력한다. 놀람은 아이디 뒤에 ??!를 붙여서 나타낸다.

 

문제를 정리하면 채점시 이미 존재하는 아이디가 입력되고, 입력한 값 뒤에 ??! 를 붙여서 출력하면 된다.

 

C++

#include <iostream>
#include <string>
using namespace std;
int main(){
    string id;
    cin >> id;
    cout << id+"??!";
    return 0;
}

 

입력받은 문자열 뒤에 "??!"를 붙여서 출력한다.

 

C#

using System;
class Program{
    static void Main(string[] args){
        string id = Console.ReadLine();
        Console.WriteLine(id+"??!");
    }
}


Python

id = input();
print(id+"??!")

 

728x90
반응형

6번

문제

두 자연수 A와 B가 주어진다. 이때, A+B, A-B, A*B, A/B(몫), A% B(나머지)를 출력하는 프로그램을 작성하시오.

 

입력

두 자연수 A와 B가 주어진다. (1 ≤ A, B ≤ 10,000)

 

출력

첫째 줄에 A+B, 둘째 줄에 A-B, 셋째 줄에 A*B, 넷째 줄에 A/B, 다섯째 줄에 A%B를 출력한다.

 

C++

#include <iostream>
using namespace std;
int main(){
    int a,b;
    cin >> a;
    cin >> b;
    cout << a+b << endl;
    cout << a-b << endl;
    cout << a*b << endl;
    cout << a/b << endl;
    cout << a%b << endl;
    
    return 0;
}

 

줄바꾸기 endl 사용

 

C#

using System;
class Program{
    static void Main(string[] args){
        string input = Console.ReadLine();
        string[] arr_input = input.Split(' ');
        int a = int.Parse(arr_input[0]);
        int b = int.Parse(arr_input[1]);
        Console.WriteLine(a+b);
        Console.WriteLine(a-b);
        Console.WriteLine(a*b);
        Console.WriteLine(a/b);
        Console.WriteLine(a%b);
    }
}

 

ReadLine으로 입력을 한 줄로 받고 string.Split을 사용해서 공백으로 두 값을 구분하여 사용한다.

 

Python

str = input()
arr = str.split(' ')
a = int(arr[0])
b = int(arr[1])
print(a+b, a-b, a*b, a//b, a%b, sep='\n')

 

파이썬의 경우 '/' , '//' 연산자가 존재한다.

앞의 두 언어들은 연산하는 두 값이 모두 int 타입이기 때문에 / 연산자를 사용하여 계산하게 되면 결과도 정수형으로 반환되기 때문에 소수점은 버려지게 된다. 하지만 파이썬의 경우 정수형간의 나눗셈은 float으로 반환하기 때문에 문제에서 몫만을 출력해야 하고 이를 위해서는 몫을 구하는 연산자 '//'를 사용해야 한다.

 

728x90
반응형

1번

문제

Hello World! 를 출력하시오.

 

출력

Hello World! 를 출력하시오.

 

C++

#include <iostream>
using namespace std;
int main(){
    cout << "Hello World!";
    return 0;
}

 

C++ 너무 오랜만에 하다 보니 처음에 입출력 라이브러리 이름이 기억이 안 났다.

iosteam (input/output stream) 입력과 출력의 기능을 사용할 수 있는 라이브러리이다. 

cout을 사용하려면 std:: 네임스페이스를 사용해야 하는데 이걸 생략하기 위해서 using으로 네임스페이스를 선언한다.

 

C#

using System;
class Program{
    static void Main(string[] args){
        Console.WriteLine("Hello World!");
    }
}


System 네임스페이스에 포함된 Console 클래스의 함수인 WirteLine을 사용해서 문자를 출력한다.

 

Python

print("Hello World!")


이렇게 보니 파이썬의 간단함에 새삼스럽게 놀란다.

 

2번

문제

두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.

 

입력

첫째 줄에 A와 B가 주어진다. (0 < A, B < 10)

 

출력

첫째 줄에 A+B를 출력한다.

 

C++

#include <iostream>
using namespace std;
int main(){
    int a, b;
    cin >> a;
    cin >> b;
    cout << a + b;
}

 

입력받은 값을 저장하기 위한 변수 a, b 선언 후 합을 출력

 

C#

using System;
class Program
{
    static void Main(string[] args)
    {
        string str = Console.ReadLine();
        string[] arr = str.Split(' ');
        int a = int.Parse(arr[0]);
        int b = int.Parse(arr[1]);
        Console.WriteLine(a + b);
    }
}

 

채점 시 한 줄에 두 값을 모두 주기 때문에 Read 사용 시 입력을 제대로 받지 못한다.

따라서 문자열로 받은 다음 값을 잘라서 정수로 변환하여 출력하여야 한다.

 

Python

str = input()
arr = str.split(' ')
a = int(arr[0])
b = int(arr[1])
print(a+b)

 

파이썬도 마찬가지로 문자로 입력받은 다음 값을 잘라서 처리한다.

 

4번 문제까지는 연산 기호만 달라서 문제만 풀고 따로 남기지 않는다.

 

5번

문제

두 정수 A와 B를 입력받은 다음, A/B를 출력하는 프로그램을 작성하시오.

 

입력

첫째 줄에 A와 B가 주어진다. (0 < A, B < 10)

 

출력

첫째 줄에 A/B를 출력한다. 실제 정답과 출력값의 절대오차 또는 상대오차가 10의 -9승 이하이면 정답이다.

 

C++

#include <iostream>
using namespace std;
int main(){
    double a, b;
    cin >> a;
    cin >> b;
    double res = a/b;
    cout.precision(10);
    cout << res;
}

 

소수점 자릿수를 정확하게 출력하기 위해서 추가 작업이 필요하다.

 

오차를 인정하는 범위가 있기 때문에 소수점 9자리까지 구해야 한다.

 

cout.precision(n)은 n자리까지 정수부+소수부의 n개까지의 수를 표시해 준다.

 

문제에서 대입하는 수의 범위는 나누었을 때 정수부가 1자리 이하이기 때문에 precision(10)을 하면 소수점 9자리까지 나오게 된다.

 

C#

using System;
class Program
{
    static void Main(string[] args)
    {
        string str = Console.ReadLine();
        string[] arr = str.Split(' ');
        double a = double.Parse(arr[0]);
        double b = double.Parse(arr[1]);
        Console.WriteLine(a / b);
    }
}

 

float의 정확도는 7번째 자리이기 때문에 double을 사용한다.

 

Python

str = input()
arr = str.split(' ')
a = float(arr[0])
b = float(arr[1])
print(a/b)

 

파이썬의 경우 double은 따로 없으며 float이 C의 double을 기반으로 15자리까지의 정확도를 가진다.

 

그 이상의 자릿수를 사용하기 위해서는 별도의 모듈인 decimal을 사용해야 한다.

 

 

728x90
반응형

매일 보던 것만 보고, 쓰던 것만 쓰다 보니 점점 머리가 굳어가는 게 느껴진다.

 

더 굳어지기 전에 좀 더 활발하게 뇌가 굴러가도록 자극을 줄 필요가 있다고 생각해서 시작하기로 한다.

 

예전에 했을 때는 한 가지 언어에만 집중해서 했다면 이번에는 최대한 새로운 언어들도 배우면서 테스트도 하는 방식으로 진행해 볼 것이다.

728x90
반응형

충돌 처리

BP_Bullet의 Event Graph로 넘어가서 충돌을 처리하는 로직을 만든다.

 

OnComponentHit 이벤트를 추가하고 Other Actor에서 BP_Enemy를 찾아 충돌한 적을 제거하고 총알도 제거한다.

 

Unreal Engine - BP_Bullet On Component Hit

 

추가로 총알이 충돌하지 않으면 계속 남아 있게 되는데 일정시간 지나면 알아서 제거되도록 한다.

 

Unreal Engine - BP_Bullet Event BeginPlay

 

총알은 생성되고 3초 뒤에 사라지게 된다.

 

Unreal Engine - Test Play

 

기초적인 게임 플레이는 구현이 된듯하다.

728x90
반응형

+ Recent posts