예전에 정리해둔 자바 vs C

Posted by 적분 ∫2tdt=t²+c
2013.09.10 13:02 프로그래밍

예전에 안드로이드 개발한다는 스터디에 반강제로 끌려들어가서 자바 공부하게되었을때 정리해두고 보지도 않았던건데 이번에 진짜로 공부하게 생겨서 정리해서 올려봄


자바와 c 의 차이점


0. 기본

전처리기(#define, #include) 없음.

따로 include하지 않아도 알아서 클래스를 찾아준다.

 

1. 타입

기본형 vs 참조형 차이!

기본-정수형: byte(8 bit), short(16 bit), int(32 bit), long(64 bit). unsigned 없음

기본-실수형, float, double

기본-불린형: boolean

기본-문자형: char(16 bit, 유니코드)

 

참조-배열형: type[] a = new type[size]; 배열 범위 벗어나면 예외 발생

참조-클래스: 구조체, 공용체 따위는 없다!!

 

2. 제어문

if: 동일

for: 동일하지만, for(int i = 0; i < 5; i ); 에서 i는 내부 스코프로 처리되지 않음

for2: for(type a : array); c 11for문과 동일

break: break label; 과 같이 레이블과 같이 사용하여 이중 루프 탈출 가능

continue: 같음

switch: 같음

 

3. 연산자

사칙 연산자: 동일, %가 실수에 대해서도 동작. (fmod함수와 일치)

대입 연산자: 동일, >>>= 추가

증감 연산자: 동일

비교 연산자: 동일

비트 연산자: 동일, >>> 연산자 추가 (shr, 비트를 오른쪽으로 밀고 상위비트를 0으로 채움)

캐스트 연산자: 동일

 

4. 클래스

선언: 마지막에 세미콜론 없음! 함수 선언과 구현이 모두 class 안에 들어가야함!


필드: 멤버 변수와 유사. 클래스 내부에서 선언과 함께 초기화 가능

상수 필드: final 지정자를 사용. 상수로 처리됨. 초기화 이후에는 변경 불가능

액세스 지정자: protected, 디폴트 주의할것

 

클래스내부

패키지내부

서브클래스

패키지외부

public

O

O

O

O

protected

O

O

O

서브클래스만

디폴트

O

O

X

X

private

O

X

X

X

 

메서드: 멤버 함수와 유사. 클래스 외부에 함수, 변수 선언 불가!

이름 없는 { } : 초기화 블록, 복잡한 초기화 코드를 작성 가능.

생성자: 동일

finalize 함수: 파괴자 없음!! 가비지 컬렉터에 의해 클래스가 해제될 때 호출됨.

정적 멤버: static 멤버 변수, static 멤버 함수와 유사.

 

5. 열거형

기본적으로 c와 같으나... 실제로는 클래스!




6. 상속

c 의 상속과 유사

class Subclass extends Superclass {

//...

}

서브클래스의 생성자에서 슈퍼클래스의 생성자 호출: super(parameters...) 호출.

자기 자신의 다른 생성자 호출: this(parameters...) 호출.

동적 바인딩: c 과 달리 모든 함수가 virtual 함수

타입확인 연산자: a instanceof Type (aType의 인스턴스면 True반환)

final 클래스: 더 이상 상속 못함

final 메소드: 상속해도 재정의 못함

다중 상속 없음!

 

7. 추상 클래스 / 인터페이스

추상 메소드: c 의 순수 가상 함수와 동일

추상 클래스: 인스턴스를 가질 수 없는 클래스, 상속하여서 사용해야 함.

인터페이스: 추상 메서드와 상수 필드만 가지는 클래스, 인터페이스 다중 상속은 가능!

interface Animal {

void Eat();

void Sleep();

}

 

class Cow implements Animal {

public void Eat() {

System.out.println("우걱우걱");

}

public void Sleep() {

System.out.println("쿨쿨");

}

}

 

class JavaExam {

public static void main(String args[]) {

Cow So = new Cow();

So.Eat();

So.Sleep();

}

}

 

8. 클래스 중첩

정적 이너 클래스: 클래스 내부에 static으로 선언된 클래스. c 의 이너 클래스와 같음.

이너 클래스: 클래스 내부에 static없이 선언된 클래스. 상위 클래스의 인스턴스와 연결됨

class Car {

CarName Name;

String Color;

//이너 클래스 선언

class CarName {

String Model;

int Year;

CarName(String aModel, int aYear) {

Model = aModel;

Year = aYear;

}

void OutColor() {

//상위 클래스의 필드 참조

System.out.println("색상은 " Color "입니다.");

}

}

 

Car(String aModel, int aYear,String aColor) {

Name = new CarName(aModel,aYear);

Color = aColor;

}

}

 

public class JavaExam {

public static void main(String[] args) {

Car Pride = new Car("프라이드", 2005, "파랑");

Pride.Name.OutColor();

 

//Pride 인스턴스와 연결되는 이너 클래스 생성

Car.CarName Pride2 = Pride.new CarName("프랑이", 2009);

Pride2.OutColor();

}

}

로컬 이너 클래스: 메소드 내부에 선언된 클래스. 외부 클래스의 멤버 참조 가능.

익명 클래스: 클래스 선언 없이 인스턴스를 만드는 위치에서 클래스를 정의.

interface ICar {

void Run();

}

 

public class JavaExam {

public static void main(String[] args) {

//익명 클래스

ICar Porter = new ICar() {

public void Run() {

System.out.println("우당탕 쿵탕");

}

};

Porter.Run();

}

}

인터페이스 역시 중첩 선언 가능함.

 

9. 패키지

c 의 네임스페이스와 유사. 이름 충돌을 방지하는데 사용

소스 파일의 첫줄에 package name; 선언하여 패키지 이름을 지정함.

import name;을 이용하여 패키지명을 밝히지 않고도 패키지 내부를 참조 가능 (c using namespace와 유사.)

 


신고
Tags
이 댓글을 비밀 댓글로
    • 곰스타
    • 2013.11.16 21:02 신고
    Java 에 unsigned 있습니다. char 가 바로 unsigned.
    char 는 C++ 의 x86 아키텍쳐 기준 컴파일러로 볼때 unsigned short 형이라 보시면 됩니다.
    유일하게 unsigned 인 이유는 6만개 가량의 유니코드 BMP 영역 (Base Multilingual Plane - UTF16)
    을 완벽히 저장하기 위함이구요.

    Java에서는 제조사인 Sun (지금은 Oracle) 이 char 형을 unsigned short (2바이트) 로 규정하고
    타 제조사에서 엄격히 해당 규격을 벗어나지 않도록 해주는데 C++ 은 옛날에 나와서 그런지 당시 모호한
    표준으로 리눅스 g++ 컴파일러 상에선 wchar_t가 4바이트로 UTF32 형태로 저장되고
    윈도우 Visual C++ 에선 wchar_t가 unsigned 2바이트 형으로 UTF16 으로 저장되는 등
    개발자들 정말 힘들게 하는 것 같습니다.
    • 오호 unsigned가 있긴 있군요ㅋ
      사실 c++로 포터블하게 코드를 작성한다는건 꿈같은 일이죠.
      표준 지켜서 짜도 이식하려면 손봐야하는경우가 워낙 많으니ㅋ