cpp와 java의 차이

2023. 3. 3. 20:58

자바를 기반으로 한 서적을 공부하다가 객체지향의 객체, 인스턴스 등 기본적인 용어가 헷갈리기 시작했다.

왜 내가 알고 있는 점과 다른가 찾다보니 cpp와 자바의 언어적 차이가 존재하는 것을 발견하였다.

자바를 공부하지는 않았지만, 나름 내용을 아래와 같이 정리해보았다.

 


1. 인스턴스의 의미
 - (java에서) 클래스를 정의 후 실제적으로 사용 시, 클래스 타입으로 선언되었을 때 객체라고 부르고, 그 객체가 메모리에 할당(new 키워드사용)되었을 때, 즉 실제로 사용될 때를 인스턴스라고 부른다.
 - 즉, 인스턴스화(객체화)란 이름뿐인 변수에 공간을 할당하는 행위를 의미한다
 - 코드적으로 보면, 초기화 함수가 호출된 이후의 변수는 인스턴스 변수라고 볼 수 있다.
 - 즉, cpp는 클래스 타입의 변수를 선언하면 객체이자 인스턴스가 되며, java에서는 선언 시는 객체, new키워드로 공간까지 할당 시에 인스턴스가 된다.


나름 정리하면 위와 같다. 
정리하고 나니, c와 cpp를 공부하며 객체지향을 배운 사람의 입장으로는 java를 기준으로 적힌 서적들에 대해 이해가 안가는 이유가 있었다...
(그래서 cpp 객체지향 강의를 볼 때 인스턴스를 객체라고도 한다고 이야기한 것 같다.)
 - https://lagifun-inforecord.tistory.com/107

** 참고 사이트
 - http://www.tcpschool.com/java/java_class_intro
 - https://todoni.tistory.com/26
 - https://wiserloner.tistory.com/202

 

 


2. 변수 관련 이야기
1) cpp
int a = 10;
Person b;
Person *b = new Person();

자바와는 다르게 객체 선언과 동시에 공간할당이 되어 자유롭게 사용이 가능하다.
new 키워드를 사용(즉 new를 사용한 인스턴스화)하는 경우는 포인와 같이 동적생성의 개념에서 사용한다.

2) java
int a = 10;
Person b = new Person();

자바는 변수를 인스턴스 변수라고 이야기한다.
객체의 경우에 new키워드를 사용해서  메모리에 공간할당을 해야 사용이 가능하다.
(이를 인스턴스화(혹은 객체화)라고 한다)



3. 변수, 함수의 분류
1) cpp
c의 개념과 객체지향의 개념이 혼합되어 있다. 분류하고자 하면 정말 많다.

 

변수
1-1) 일반변수
 - 지역변수(함수내 선언), 전역변수(함수 밖 선언)
1-2) 포인터 변수(*)
 - 주소를 가리키는 변수
1-3) 참조형 변수(&)
 - 참조자를 사용하여 변수와 동기화
1-4) 정적변수
 - static 키워드로 생성
 - c의 개념으로는 변수의 생존기간, 생성시기를 조절해준다
    ex) 전역변수에 static 붙일 시, 해당 파일에서만 해당 전역변수 사용
        함수내 지역변수에 static 붙일 시, 함수가 종료되도 해당 변수의 공간은 남아있어 다음에도 그대로 참조가능
 - cpp의 개념으로는 클래스 static 맴버변수가 있다.(자바의 개념과 동일)
1-5) 클래스 맴버변수
 - 클래스를 구성하는 맴버변수
1-6) 매개변수
 - 외부와 함수간의 연결을 위해 사용하는 변수

메소드(함수)
 - 일반함수(전역함수) : c에서의 개념으로 일반함수인데, 실제적으로 전역함수이다.
     cpp의 개념에서 전역함수는 namespace안에 선언하여 namespace 내에서 전역함수의 개념으로 볼 수도 있고,
     namespace 밖에(파일에) 선언하는 것을 전역함수로 볼 수도 있다.
 - 정적함수 : static 키워드로 파일내 참조 범위를 제한
 - 맴버함수 : 클래스를 구성하는 맴버로서 함수선언
 - (클래스)static 맴버함수 : 자바의 클래스 메소드와 동일한 개념

 


2) java

변수

2-1) 클래스 변수
 - 클래스 내에서 static 키워드로 선언한 변수, 해당 클래스 형대의 모든 객체에서 공유되는 변수이며, 객체선언 이전에 초기화가 필요함
2-2) 인스턴스 변수
 - new키워드를 사용해서 메모리에 할당되며, heap영역에서 공간이 할당된다.
 - 클래스변수와 마찬가지로 클래스 영역에서 선언된다.
2-3) 지역 변수
 - 메소드내에서 선언하는 변수, 스택영역에서 공간이 할당된다.
2-4) 매개변수
 - 외부와 함수간의 연결을 위해 사용하는 변수
 - 매개변수를 제외하고 클래스 변수, 인스턴스 변수, 지역변수만 자바의 변수로 보는 곳도 있다.

메소드
 - 클래스 메소드 : 클래스 내에서 static 키워드로 선언, 클래스 변수만 사용이 가능하며 객체 생성없이 클래스 이름으로 호출이 가능하다
    ex) Person::func();
 - 인스턴스 메소드 : 클래스 내의 일반메소드, 객체생성으로 호출이 가능하다.

** 참고 사이트
 - https://itmining.tistory.com/20



4. 기타 참고 사이트
글을 쓰면서 찾아본 사이트
 - 클래스, 객체, 인스턴스 구분 1
    : https://digiconfactory.tistory.com/entry/C-%ED%81%B4%EB%9E%98%EC%8A%A4-%EA%B0%9D%EC%B2%B4-%EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4-%EC%B0%A8%EC%9D%B4
 - 클래스, 객체, 인스턴스 구분 2
    : https://m.blog.naver.com/PostView.naver?blogId=good_ray&logNo=222069343755&proxyReferer=https:%2F%2Fcomputer-science-student.tistory.com%2F


 - cpp와 자바의 차이(위키)
    : https://ko.wikipedia.org/wiki/%EC%9E%90%EB%B0%94%EC%99%80_C%2B%2B%EC%9D%98_%EB%B9%84%EA%B5%90
 - cpp와 자바에 대해 구분지어 잘 정리되어 있음
    : https://preamtree.tistory.com/6

 - cpp의 정적맴버와 상수맴버
    : http://www.tcpschool.com/cpp/cpp_encapsulation_staticConst
 - cpp에서의 static와 관련된 맴버/함수 종류
    : https://codingcoding.tistory.com/736
 - 클래스의 const static 맴버변수
    : https://musket-ade.tistory.com/entry/C-static-%EB%A9%A4%EB%B2%84%EB%B3%80%EC%88%98-%ED%81%B4%EB%9E%98%EC%8A%A4-%EB%B3%80%EC%88%98-%EC%99%80-static-%EB%A9%A4%EB%B2%84%ED%95%A8%EC%88%98-mutable

 - 자바에서의 클래스 변수(static)와 인스턴스 변수(non-static)의 구분 및 선언되는 메모리영역
    : https://sujinhope.github.io/2021/03/03/Java-%ED%81%B4%EB%9E%98%EC%8A%A4%EB%B3%80%EC%88%98,-%EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4-%EB%B3%80%EC%88%98-%EC%B0%A8%EC%9D%B4(Static%EB%B3%80%EC%88%98%EC%99%80-Non-Static%EB%B3%80%EC%88%98).html
 - jvm 메모리 구조
    : https://jeong-pro.tistory.com/148

'Study > 프로그래밍_언어' 카테고리의 다른 글

객체지향 및 cpp 강의 필기  (0) 2023.02.20
cpp - 후기  (0) 2022.10.07
시작  (0) 2020.07.22
C언어 보충6 - 18, 19장, 추가사항  (0) 2018.02.03
C언어 보충5 - 16, 17장  (0) 2018.02.03

+ Recent posts