Programming Language 98

[C++] Implicit Conversion(묵시적 형변환)

Implicit Conversion(묵시적 형변환)묵시적 형변환과 명시적 형변환묵시적(암시적) 형변환: implicit conversion형변환을 겉으로 드러내지 않음명시적 형변환: explicit conversion형변환을 명시한다변환 생성자#include #include using namespace std;class Item { public: Item(int num) : num(num) { // 변환 생성자 cout 이동생성자를 통해 i3로 대입 // 묵시적 변환 Item i4 = (Item)4; // Item(int num) 생성자가 형 변환까지 하고 있음. // 명시적 변환전부 Item(int num) 생성자를 호출우리가 알고 있는 일반적인 일반적인 생성..

[C++] 이동 시맨틱(Move Semantics): 이동 생성자, 이동 대입 연산자

이동 시맨틱(Move Semantics): 이동 생성자, 이동 대입 연산자필독아래에서 주의해서 봐야할 내용이 있습니다. C++17부터 Guarenteed Copy Elision(보장된 복사 생략)이라는 개념이 들어오면서 단순히 함수의 리턴값을 대입하는 경우 임시 객체를 만드는 과정을 생략합니다. 아래 예시에서도 단순히 함수의 리턴 값을 대입하고 있는데, 이 글은 C++11을 기준으로 작성된 내용이므로 실제 컴파일러에서 코드를 돌리는 것과 동일하게 작동하지 않습니다. 이동 시맨틱에 대해서 배운다는 목적으로 아래 내용을 참조하면 되겠습니다.깊은 복사의 문제점을 해결하기 위해 얕은 복사를 사용객체를 복사할 때 하나 하나 많은 양의 값을 복사를 해야함.깊은 복사가 필요 없는 경우도 존재함// 고의적으로 얕은 복..

[Java] 09. OOP - 추상 클래스(abstract class)

추상 클래스(abstract class)미완성 설계도로 완성된 제품을 만들 수 없듯이 추상클래스로 인스턴스는 생성할 수 없다.추상 클래스는 상속을 통해서 자손클래스에 의해서만 완성될 수 있다.추상 클래스는 새로운 클래스를 작성하는데 있어서 바탕이 되는 조상클래스로서의 중요한 의미를 갖는다abstract class 클래스이름 { // ...}키워드 'abstract'를 붙이기만 하면 된다추상 클래스에도 생성자가 있으며, 멤버변수와 메서드를 가질 수 있다추상메서드(abstract method)선언부만 작성하고 구현부는 작성하지 않은 채로 남겨 둔 메서드. 미완성 메서드임미완성으로 남겨둔 이유는?메서드의 내용이 상속받는 클래스에 따라 달라질 수 있기 때문에 조상 클래스에서는 선언부만을 작성하고, 주석을 ..

[Java] 08. OOP - 다형성(polymorphism)

다형성(polymorphism)여러가지 형태를 가질 수 있는 능력자바에서는 한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록 함으로써 다형성을 구현조상클래스 타입의 참조변수로 자손클래스의 인스턴스를 참조할 수 있도록 하였다공통으로 포함된 인스턴스만 접근할 수 있다같은 타입의 인스턴스라도 참조변수의 타입에 따라 사용할 수 있는 멤버의 개수가 달라진다반대로 자손 타입의 참조변수로 조상 타입을 참조할 수 없음(컴파일 에러)참조변수가 사용할 수 있는 멤버의 개수는 인스턴스의 멤버 개수보다 같거나 적어야 한다참조변수의 형변환기본형 변수와 같이 참조변수도 형변환이 가능함단, 서로 상속 관게에 있는 클래스 사이에서만 가능함 (부모 자식)Up-casting : 자손타입을 부모타입에 // 형 변환 생략 가능(..

[C++] 대입 연산자 오버로딩

대입 연산자 오버로딩대입 연산자(=)는 객체에 다른 객체의 값을 할당하는 데 사용됨대입 연산자 오버로딩을 통해 자신이 정의한 클래스에 대해 대입 연산자의 동작을 사용자 지정하거나 확장함기본적으로 C++ 컴파일러는 멤버변수 단위로 얕은 복사(shallow copy)를 수행하지만, 깊은 복사(deep copy)를 수행하도록 지정할 수 있음/* 생략 */// 대입 연산자 오버로딩String &operator=(const String &rhs) { // 참조로 선언하지 않으면 rhs(s1)이라는 복사 생성자가 작동해서 복잡해짐. if (this != &rhs) { // 자기 자신을 대입하는 경우를 막기. // 만약 strData에 어떤 값이 존재한..

[C++] 복사 생성자 오버로딩

복사 생성자 오버로딩복사 생성자란 객체를 다른 객체로 복사하는 데 사용되는 특별한 생성자동일한 클래스의 다른 객체로부터 호출되며, 그 결과로 현재 객체가 다른 객체와 동일한 상태로 초기화됨/* 생략 */// 복사 !!!생성자!!!의 작동 String(const String &rhs) { // String s2(s1); 사용시 발생하는 일. // const String rhs 로 선언하면 안된다(무한 루프에 빠짐) cout String(const String &rhs) 에서 rhs가 아닌 &rhs를 사용해야 함레퍼런스로 선언하지 않으면 매개변수가 전달되는 과정에서 rhs(전달된 매개변수) 가 일어남이는 다시 복사 생성자를 호출하므로, 무한 루프에 빠지게 됨따라서 매개변수를 ..

[C++] 깊은 복사와 얕은 복사(Deep Copy, Shallow Copy)

깊은 복사와 얕은 복사(Deep Copy, Shallow Copy) 깊은 복사 / 얕은 복사란 얕은 복사 : 복사된 객체가 원본 객체의 요소들을 참조 예시 int *a = new int(5); int *b = new int(3); a = b; delete a; delete b; 3이 저장된 공간을 두 번 지움 5가 저장된 공간이 안지워짐 위와 같은 복사를 얕은 복사라 한다.(참조만 복사) 객체 내부에 참조 타입이 있는 경우에는 얕은 복사로 인해 문제가 발생할 수 있음 깊은 복사 : 원본 객체의 완전한 복사본을 생성, 복사된 객체는 완전히 독립적인 새로운 객체를 가지게 됨 내부에 있는 모든 객체들까지 재귀적으로 복사함 예시 int *a = new int(5); int *b = new int(3); *a =..

[Java] 07. OOP - 상속과 접근제어자

상속과 접근제어자상속(inheritance)기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것class 이름 뒤에 상속받고자 하는 클래스의 이름을 키워드 'extends'와 함께 써 주기만 하면 된다class Child extends Parent { // ...}조상 클래스 : 상속해주는 클래스 (a.k.a 부모, 상위(super), 기반(base) 클래스)자손 클래스 : 상속 받는 클래스 (a.k.a 자식, 하위(sub), 파생된(derived) 클래스)생성자와 초기화 블럭은 상속되지 않음. 멤버만 상속됨자손 클래스의 멤버 개수는 조상 클래스보다 항상 같거나 많다class Tv { boolean power; // 전원상태(on/off) int channel; // 채널 void power() ..

[Java] 06. OOP - 클래스와 객체

클래스와 객체클래스와 객체의 정의클래스의 정의 : 객체를 정의해 놓은 것클래스의 용도 : 객체를 생성하는데 사용된다객체와 인스턴스클래스의 인스턴스화(instantiate) : 클래스로부터 객체를 만드는 과정인스턴스 : 어떤 클래스로부터 만들어진 객체ex) Tv클래스로부터 만들어진 객체를 Tv클래스의 인스턴스라고 함인스턴스의 생성과 사용클래스명 변수명; // 참조변수 선언변수명 = new 클래스명();Tv t;t = new Tv();객체 배열객체 배열을 다루기 위한 참조 변수 배열을 생성객체를 생성해서 배열의 각 요소에 저장Tv[] tvArr = new Tv[3]; // 참조변수 배열을 생성// 객체를 생성해서 배열의 각 요소에 저장tvArr[0] = new Tv();tvArr[1] = new Tv();t..

[Java] 05. 배열

배열배열 생성 방법타입[] 변수이름 = new 타입[길이]길이가 0인 배열을 생성할 수 있다JVM이 모든 배열의 길이를 별도로 관리하고, '배열이름.length'를 통해서 배열의 길이에 대한 정보를 얻을 수 있다.배열은 한 번 생성하면 길이를 변경할 수 없다.공간이 부족해 배열의 길이를 변경해야 하는 경우 더 큰 길이의 새로운 배열을 생성한 다음 기존 배열의 값을 새로운 배열에 복사한다유효한 인덱스 범위를 넘어서면 ArrayIndexOutOfBoundsException이라는 예외가 발생한다코드를 변경해 배열의 길이가 바뀔 때, '배열이름.length'는 for문에서 알아서 값을 update 해준다.배열의 초기화배열 생성과 동시에 자동적으로 자신의 타입에 해당하는 기본값으로 초기화 됨선언과 생성을 동시에 ..