'diff C++ Java C#'에 해당되는 글 3건

  1. 2010.08.21 언어별 코드
  2. 2010.08.19 생성자, 상속, 오버라이딩
  3. 2010.08.18 클래스간의 형변환

언어별 코드

|
#접근 제어자
C++는 :을 이용하여 여러 변수에 적용 가능하다.
Java는 변수명, 함수명, 클래스명 앞에 각각 적어야 한다.
C++ : private < protected < (public)
Java : private < (default) < protected < public

[Java]
private : 같은 클래스의 메소드만 접근 가능
default : 같은 패키지 내에서 접근 가능, 기본으로 지정되는 접근 제어자, 생략 가능
protected : 패키지에 관계없이 자손 클래스에서 접근 가능
public : 모든 패키지, 모든 클래스에서 접근 가능
[C++]
private : 같은 클래스의 메소드만 접근 가능, 기본으로 지정되는 접근 제어자, 생략 가능
protected : 자신과 상속받은 클래스에서 접근 가능
public : 모든 클래스 및 함수에서 접근 가능

#배열 선언
Java
int [] array; //스택에 참조 변수의 메모리 4바이트만 할당.
array = new int [5]; //힙에 메모리 20바이트 할당. 0으로 초기화 됨.
--
int [] array = { 1, 2, 3 }; //생성과 동시에 초기화
C++
int array[5]; //스택에 메모리 20바이트 할당. 초기화 안됨.

[Java]
arr1은 생성만 하여 0을 출력, arr2는 생성과 동시에 초기화되어 1을 출력
import java.lang.System;

public class ArrayTest {
    public static void main(String args[]) {
    	int [] arr1 = new int [3];
    	int [] arr2 = { 1, 2, 3 };

    	System.out.println("arr1[0] = " + arr1[0]);
    	System.out.println("arr2[0] = " + arr1[0]);

    }
}

[C++]


#객체 선언
Java

C++


[Java]
반드시 new 연산자로만 생성해야 한다. 힙 영역에 메모리 할당
import java.lang.System;

class Person {
    String name;
    int age;
}

public class PersonTest {
    public static void main(String args[]) {
    	Person p;
    	p = new Person();
    	p.name = "Jack";
    	p.age = 20;
    	System.out.println("p.name : " + p.name);
    	System.out.println("p.age  : " + p.age);
    }
}

[C++]
스택 영역에 할당한 경우
#include <iostream>
#include <string>
using namespace std;

class Person {
public:
    string name;
    int age;
};

int main(int argc, char* argv[]) {
    Person p;
    p.name = "Jack";
    p.age = 20;
    cout << "p.name : " << p.name << endl;
    cout << "p.age  : " << p.age << endl;

    return 0;
}

힙 영역에 할당한 경우
#include <iostream>
#include <string>
using namespace std;

class Person {
public:
    string name;
    int age;
};

int main(int argc, char* argv[]) {
    Person* p = new Person;
    p->name = "Jack";
    p->age = 20;
    cout << "p.name : " << p->name << endl;
    cout << "p.age  : " << p->age << endl;
    delete p;

    return 0;
}


#this
객체 자신을 가리킨다.

Java
자신의 멤버에 접근시 .을 사용한다.
C++
ClassName* const 타입이다.
자신의 멤버에 접근시 ->를 사용한다.

#this() 생성자
Java
같은 클래스 내의 생성자가 오버로딩된 다른 형태의 생성자를 호출할 때 사용한다.
다른 메소드보다 제일 먼저 호출해야 한다.
C++
생성자가 다른 생성자를 호출할 수 없다??

Java


[C++]


#추상 클래스
Java
인스턴스를 생성할 수 없는 하나 이상의 추상 메소드를 가진 미완성 클래스
필드와 메소드, 생성자를 가질 수 있다.
레퍼런스 변수는 선언할 수 있다. 자신의 서브 클래스로 선언된 인스턴스들을 가리킬 수 있다.

abstract class 추상 클래스 이름 {
// 필드 선언
// 일반 메소드 정의
// 생성자 정의
abstract 접근 제어자 리턴 타입 추상 메소드 이름 (매개변수 리스트);
}
C++
객체를 생성할 수 없는 하나 이상의 순수 가상 함수를 가진 클래스
멤버 변수와 멤버 함수, 생성자, 소멸자를 가질 수 있다.

class 추상 클래스 이름 {
// 접근 지정자
// 멤버 변수 선언
// 멤버 함수 선언
// 생성자, 소멸자 선언
virtual 리턴 타입 멤버 함수 이름 (매개변수 리스트) = 0;
}


Java


[C++]




#인터페이스
자바에서 다중 상속을 가능하게 하기 위해 제공
Java
상수 또는 추상 메소드들만 포함
인터페이스의 모든 메소드는 내부적으로 public이다.
인터페이스 내부의 메소드에 접근 지정자가 명시되어 있지 않다면 서브 클래스에서는 접근 지정자를 지정할 수 없으므로 public으로 선언해야 한다.


C++



Java


[C++]





#
Java


C++



Java


[C++]





#
Java


C++



Java


[C++]





#
Java


C++



Java


[C++]





#
Java


C++



Java


[C++]





#
Java


C++



Java


[C++]





#
Java


C++



Java


[C++]





#
Java


C++



Java


[C++]



-- end --

'diff C++ Java C#' 카테고리의 다른 글

생성자, 상속, 오버라이딩  (0) 2010.08.19
클래스간의 형변환  (0) 2010.08.18
And

생성자, 상속, 오버라이딩

|
초기화 : 변수가 메모리 할당을 진행하는 동시에 값을 설정하는 것
생성자 : 인스턴스가 생성되는 동시에 값을 설정하는 것

디폴트 생성자 : 프로그래머가 생성자를 명시적으로 만들지 않아도 자바 컴파일러가 제공해 주는 생성자. 모든 클래스에 적용
public ClassName() { }
단, 프로그래머가 생성자를 하나라도 생성하였을 경우에는 제공되지 않는다. 따라서 인자가 없는 생성자를 사용하는 경우 반드시 작성해 주어야 한다.

this() 생성자
같은 클래스 내의 생성자가 다른 형태의 생성자를 호출할 때 사용
반드시 다른 어떤 메소드보다 먼저 호출되어야 한다. (변수 대입은 상관없는가?)
* 생성자 내부의 첫 문장으로 this()가 기술되어야 한다.
* this()는 생성자에서만 사용할 수 있다.

오버라이딩할 때 상속받은 메소드도 포함하여 작성하기
super.method();

상속에서의 super() 생성자
명시하지 않아도 자동적으로 호출된다.
이 때, 부모 클래스에서 인자가 있는 생성자가 있다면 반드시 인자가 없는 생성자를 명시해 주어야 한다.
왜냐하면 자식 클래스에서 인자가 없는 생성자를 쓸 수도 있기 때문이다.

슈퍼 클래스에 인자가 있는 생성자만 존재하는 경우에는 super(인자)로 직접 호출해야 한다. 첫문장으로 기술되어야 한다.

인터페이스가 인터페이스를 상속받을 때에는 extends를 쓴다.


'diff C++ Java C#' 카테고리의 다른 글

언어별 코드  (0) 2010.08.21
클래스간의 형변환  (0) 2010.08.18
And

클래스간의 형변환

|
C++
객체간의 형변환
HTMLWriter hw;
DocWriter dw;
hw = dw; //실패
dw = hw; //성공, 부모 객체와 자식 객체에 공통적으로 있는 멤버들이 1:1로 대입된다. dw의 멤버함수가 호출된다.

포인터간의 형변환, 레퍼런스간의 형변환
DocWriter dw;
HTMLWriter* phw = &dw; //실패

HTMLWriter hw;
DocWriter* pdw = hw; //성공, 자식 객체(hw)의 멤버변수가 사용된다. 부모 객체(pdw)의 멤버함수가 호출된다. virtual인 경우 자식 객체의 멤버함수가 사용된다.

업캐스트 & 다운캐스트
HTMLWriter hw;
DocWriter* pdw = &hw; //업캐스트
HTMLWriter* phw = (HTMLWriter*)pdw; //다운캐스트

DocWriter dw;
HTMLWriter* phw = dw; //다운캐스트 안됨
HTMLWriter* phw = (HTMLWriter*)dw; //다운캐스트







Java
인스턴스 변수의 초기화가 가능하다.
부모 클래스의 변수를 사용 (Variable Shadowing)
자식 클래스의 메소드를 사용 (Polymorphism)
class A {
	int x = 1;
	int y = 2;
	
	void disp() {
		System.out.println("A class, " + x);
	}
}

class B extends A {
	int x = 10;
	int y = 20;
	int z;
	
	void disp() {
		System.out.println("B class, " + x);
	}
}

public class PolymorphismTest {
	public static void main(String args[]) {
		//UpCast a.x = 1
		B b = new B();
		A a = b; //A a = (A)b;
		System.out.println(a.x);
		a.disp();
	}
}




기본 매개변수 : 정적 바인딩 (선행 바인딩)
가상 함수 : 동적 바인딩 (지연 바인딩)

상속받은 매개변수는 절대 재정의해서는 안된다. 정적 바인딩이 되므로 부모 클래스의 가상함수에서 정의된 매개변수의 값이 들어간다.


C++
*
생성자나 멤버함수를 통해 멤버변수의 초기화가 가능하다.
인자가 없는 생성자로 생성한 경우, 부모 클래스의 멤버변수, 멤버함수가 사용된다.
인자가 있는 생성자로 생성한 경우, 자식 클래스의 멤버변수, 부모 클래스의 멤버함수가 사용된다.
부모 클래스의 멤버함수 앞에 virtual을 붙이면 자식 클래스의 멤버변수, 멤버함수가 사용된다.

잘못 작성한 경우
class A { int x, y; };
class B : public A { int x, y, z; };
이 경우 A의 x와 B의 x는 서로 다른 멤버변수이다.
B b;
b.x는 B의 x이고, b.A::x가 A의 x이다.
상속받은 멤버변수는 A::x가 된다.


복사 생성자가 작성되어 있으면 복사 생성자 호출시 디폴트 생성자를 호출하지 않는다.
또한 초기화 할 때에만 복사 생성자를 호출할 수 있다.
복사 생성자를 작성하지 않고 사용할 경우 멤버 변수를 1:1로 복사한다.

부모 클래스에 생성자가 여러 개일 경우
자식 클래스에서 각각에 맞는 부모 클래스의 생성자를 호출해 주어야 한다.
그렇지 않으면 부모 클래스의 디폴트 생성자를 호출하게 된다.



-

'diff C++ Java C#' 카테고리의 다른 글

언어별 코드  (0) 2010.08.21
생성자, 상속, 오버라이딩  (0) 2010.08.19
And
prev | 1 | next