기초 자바 질문 하나 드릴께요~

bluesound의 이미지

class Calc{
	Calc(){
		System.out.println("1-3개 사이의 정수를 입력하세요." );
	}
	Calc(int i){
		System.out.println("원의 넓이는 "+i*i*3.14+"입니다.");
	}
	Calc(int i, int j){
		System.out.println("사각형의 면적은 "+i*j+"입니다.");
	}
	Calc(int i, int j, int k){
		System.out.println("육면체의 부피는 "+i*j*k+"입니다.");
	}
}
class Report{
	public static void main(String args[]){
		switch(args.length){
			case 1: 
				new Calc(Integer.parseInt(args[0]));
				break;
			case 2:
				new Calc(Integer.parseInt(args[0]),Integer.parseInt(args[1]));
				break;
			case 3:
				new Calc(Integer.parseInt(args[0]),Integer.parseInt(args[1]),Integer.parseInt(args[2]));
				break;
			default:
				new Calc();
		}
	}
}

		
		

위는 자바에서 생성자 오버로딩에 관한 예제입니다.
궁금한게 class Calc 를 사용할때
왜 객체 생성없이 바로 new Calc(); 를 사용했는데 에러가 나지
않는건가요?

Calc aaa = new Calc(); 이런식으로 사용해야 하는거
아닌가요? 에러 없이 실행 되는데 이유가 뭘까요?

객체 생성안해도 생성자가 실행 된다는건
함수? 랑 비슷한 경우라고 생각하면 될까요? 흠..

익명 사용자의 이미지

bluesound wrote:

왜 객체 생성없이 바로 new Calc(); 를 사용했는데 에러가 나지
않는건가요?

new Calc(); 가 객체 생성한것입니다.
bluesound wrote:

Calc aaa = new Calc(); ...

이것은 두가지 일을 한것이지요.
1) 객체생성
2) 생성된 객체에 대한 레퍼런스를 지정(assignment)
왜? 생성한 객체를, 프로그램에서 나중에 또 쓸라고(호출)...

* C나 C++같이 메모리 관리를 프로그래머가 해주어야 하는경우,
new Calc();
또는
malloc(10);
이렇게만 코딩하면 난리나지요.
자바는 메모리 관리를 프로그래머에게서 뺏어간 언어입니다.
메모리관리는 프로그래머의 숙달과정에 반드시 있어야 하는 것이라고, 생각하는 저는 이렇게 얘기하곤 합니다.
"자바...편하긴(?????) 하지만, 연마하는 사람(학생?)에게 절대 권고하지 않는 언어(플랫폼)입니다. 그러나, 업자가 쓰기에는 좋겠지...."

bluesound의 이미지

Quote:

new Calc(); 가 객체 생성한것입니다.
bluesound 씀:

Calc aaa = new Calc(); ...

이것은 두가지 일을 한것이지요.
1) 객체생성
2) 생성된 객체에 대한 레퍼런스를 지정(assignment)

이 말씀은 Calc aaa; 라는 구문은 객체 생성이 아니라는 말씀이군요
(맞나요? ^^;;)
그렇담...그냥 new Calc(); 로 생성된 객체의
멤버 변수나 메서드에는 접근하지 못나는 것 맞나요?

그리고 결론적으로 위의 예는
바람직하지 못한 코딩인것 같네요 흠..

답변 감사합니다.

익명 사용자의 이미지

Anonymous wrote:

...
new Calc(); 가 객체 생성한것입니다.
...

그리고, 객체 생성시에는 생성자(constructor)가 불리게 되어 있지요?

mr.lee의 이미지

접근자 없이 new 로 객체 생성해서 메소드 접근할 수 있지요 당연히..

(new Class()).method();
(new Class()).member = 5;

뭐 이런식이죠. (괄호를 둘러싸지 않아도 에러는 안나지만 보기에 안좋고 헷갈리죠)

특히 inner class 들의 객체생성은 C++에 그것에 비해서 개념을 달리 할 필요가 있죠.

Class.Inner a = new Class().new Inner();
역시 괄호를 쳐서
Class.Inner a = (new Class()).new Inner();
해주는게 좀더 나아 보이기도 하군요.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.