지난시간에 내용을 기억하고 계신지요! 지난시간에는 클래스와 객체에 대해서 알아보았습니다. JAVA는 "객체지향 프로그래밍"이라는 프로그래밍 방법론을 주되게 사용하며, 이 "객체"를 만들기 위한 도구를 "클래스(class)", 도구로 생성된 객체의 실제형태를 "인스턴스(Instance)"라고 부른다는것이 지난 글의 주된 내용입니다. 이번시간에 다룰 주제는 객체와 인스턴스를 구현하는 생성자에 대한 이야기를 조금 더 깊게 해볼까 합니다. 지난 이야기가 기억이 나지 않으신다면, 꼭! 저번 글을 읽고 와주시기 바랍니다!

2021.12.01 - [JAVA] - [JAVA와 친해지기] 클래스와 객체

 

[JAVA와 친해지기] 클래스와 객체

프로그래밍 방법론(Programming Methodology)라는 것이 있습니다. 프로그래머는 컴퓨터와 대화를 하는 사람으로 어떠한 언어를 사용해서 컴퓨터와 대화를 할지 결정해서 컴퓨터에게 작업을 지시하기

tutoreducto.tistory.com


생성자(Constructor)

지난시간에 간단하게 생성자에 대해서 다루었습니다. 지난시간의 정의로는

  • 생성자(Constructor) : 객체가 인스터스화될때(생성될 때) 호출되는 블럭 생략가능하다.

로 말씀을 드렸죠. 지난시간의 코드를 다시 들고 오겠습니다.

 

// Dog.java

public class Dog{
	
	int gender;
	int height;
	int weight;
	boolean adorable;
	boolean cute;
	
	Dog(){
    		System.out.println("Hello Im dog");
    	}	// 객체생성자
	
	public void eat(){}
	public void bark(){}
	public void sleep(){}
	public void tailling(){}
	
}

위의 코드 중 Dog(){}라는 부분이 이 Dog 클래스의 생성자입니다. 생성자는 다음과 같은 특징이 있습니다!

  1. 생성자는 클래스이름(){}의 형태로 이루어진다.
  2. 생성자는 파라미터(소괄호 안에 들어가는 부분) 를 변경하여 여러개 생성할 수 있다.
  3. 생성자를 생략하면 디폴트 생성자( 클래스이름(){} ) 이 자동으로 추가된다.

코드를 통해서 살펴보겠습니다!

// Dog.java

public class Dog{
	
	int gender;
	int height;
	int weight;
	boolean adorable;
	boolean cute;
	
    // 3. 아래처럼 클래스이름(){} 된 생성자는 디폴트 생성자(Default Constructor)라고 부르며
    //    생성자를 명시하지 않은 경우에 자동으로 컴파일러에서 붙여준다.
	Dog(){
    		System.out.println("Hello Im dog");
    	}	// 1. 객체생성자, 생성자는 클래스이름과 동일한 함수의 형태를 가진다.
       
    Dog(int gender){
        this.gender = gender;
    }   // 2. 파라미터를 다르게 하여 여러개의 생성자를 선언할 수 있다.
	
	public void eat(){}
	public void bark(){}
	public void sleep(){}
	public void tailling(){}
	
}

2.의 내용처럼 파라미터를 다르게 하여 생성자를 여러개 선언하는 것을 생성자 오버로딩(Constructor Overloading) 이라고 부릅니다! 추후 함수에 관련된 이야기를 할 떄도 Overloading이라는 단어를 보실 수 있으실 겁니다!

 

gender를 파라미터로 받는생성자블럭에 this라는 키워드가 보입니다. this는 인스턴스화된 class자기자신을 의미합니다.

따라서 this.gender라는 것은 public class Dog{바로 아래 있는 멤버변수(클래스 변수) int gender;를 의미하고, this.gender=gender의 우항 gender는 파라미터로 전달된 값을 의미합니다. 

다음의 예시를 살펴보겠습니다.

// Dog.java

public class Dog{
	
	int gender;
	int height;
	int weight;
	boolean adorable;
	boolean cute;
	
	Dog(){
    		System.out.println("Hello Im dog");
    	}	// 객체생성자
	
	public void eat(){}
	public void bark(){}
	public void sleep(){}
	public void tailling(){}
    
    public void printGender(){
        if(gender == 1){
            System.out.println("남성");
        }else{
            System.out.println("여성");
        }
    }
	
}

public class Main{
	public static void main(String[] args){
      Dog bagGu = new Dog(1);
      Dog hwangGu = new Dog(2);
      
      bagGu.printGender();
      hwangGu.printGender();
    }
}
## 출력결과
남성
여성

그렇습니다. 인스턴스화한 bagGu의 gender는 생성자블럭의 this.gender = gender에 의해서 bagGu의 멤버변수 gender는 1로, hwangGu의 멤버변수 gender는 2로 초기화됩니다.(bagGu의 this는 bagGu이며, hwangGu의 this는 hwangGu입니다.)

 

this키워드를 잘 이용하면, 생성자에서 다른 생성자를 호출할 수도 있습니다.

// Dog.java

public class Dog{
	
	int gender;
	int height;
	int weight;
	boolean adorable;
	boolean cute;
	
	Dog(){
    		System.out.println("Hello Im dog");
    	}	
       
    Dog(int gender){
        this();  // 위의 Dog(){ System.out.println("Hello Im dog"); } 호출
        this.gender = gender;
    }  
	
	public void eat(){}
	public void bark(){}
	public void sleep(){}
	public void tailling(){}
	
}

 이렇게 생성자를 다른 생성자에서 사용함으로 나오는 이점은 생성자를 재사용할 수 있다는 점입니다. 생성자A와 B가 있는데, 모든 100가지 줄이 같고 B에 한줄만 추가되는 거라면? 궅이 같은 내용을 A / B에 두번씩 쓸필요없이, A에 한번만 쓰고, B는 A를 호출하기만 하면 되겠죠?


이번시간에는 여러가지 생성자를 선언하는 방법과 디폴트 생성자, this키워드가 어떤것인지, 사용은 어떻게 하는지 알아보았습니다. 다음시간에는 객체의 기능, 행동을 표현하는 매서드(함수)에 대해서 알아보겠습니다!

프로그래밍과 알고리즘

 

우리는 JAVA를 이용해서 프로그래밍을 하고 있습니다! 근본적인 질문으로 프로그래밍이란 무엇일까요? 사전에 프로그래밍의 정의는 다음과 같이 서술되어있습니다!

컴퓨터 프로그래밍(영어: computer programming) 또는 간단히 프로그래밍(programming, 문화어: 프로그램 작성) 혹은 코딩(coding)은 하나 이상의 관련된 추상 알고리즘을 특정한 프로그래밍 언어를 이용해 구체적인 컴퓨터 프로그램으로 구현하는 기술을 말한다.

< 프로그래밍의 정의 : 출처 위키백과 https://ko.wikipedia.org/wiki/%EC%BB%B4%ED%93%A8%ED%84%B0_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D >

2번째 줄을 조금 강조해서 볼까요?

 

"하나 이상의 관련된 추상 알고리즘을 특정한 프로그래밍 언어를 이용해 구체적인 컴퓨터 프로그램으로 구현하는 기술을 말한다."

 

오호; 그럼 여기서 프로그래밍 언어는 우리가 선택한 JAVA가 될 것이고 우리는 구체적인 컴퓨터 프로그램을 만들기 위해서 프로그래밍이라는 행위를 하는 것을 알 수 있겠죠! 그런데 앞쪽에 문제를 해결하기 위해 [추상 알고리즘]을 사용한다고 되어있습니다! 알고리즘이란 무엇일까요? 이번에는 알고리즘의 사전적 정의입니다.

알고리즘(영어: algorithm), 셈법은 수학과 컴퓨터과학, 언어학 또는 엮인 분야에서 어떠한 문제를 풀어 맺기 위해 정해진 일련의 절차나 방법을 공식화한 형태로 표현한 것, 계산을 실행하기 위한 단계적 절차를 의미한다. 

< 알고리즘의 정의 : 출처 위키백과 https://ko.wikipedia.org/wiki/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98 >

알고리즘은 문제해결을 위해서 사용하는 일련의 절차나 방법을 공식화한 형태라고 합니다! 알고리즘이 어떻게 생겼는지 한번 아래 그림을 보도록 할까요?

위 사진은 필자블로그의 다른 글이 WebHacking사이트 Suninatas의 1번 문제 풀이 알고리즘을 가져온 것입니다. 위와 같이 일련적으로 사용하는 문제 해결절차를 우리는 알고리즘이라고 정합니다!

 


변수와 상수

 

프로그래밍에는 어마어마하게 많은 수들이 있습니다! 위에 알고리즘만 보아도 위에서부터 2번째 그림에 str이라는 요소가 순서도 전반적으로 사용되고, 중간에는 "a"라던지 "in"이라던지, 고정된 값들이 있지요. 이런 수들은 프로그래밍에서 크게 가변성에 따라 다음의 2가지로 분류합니다.

  • 변수 : 프로그래밍을 사용하면서 변할 수 있는 수
  • 상수 : 변하지 않는 고정된 값

다음의 코드를 다들 코딩해 봅시다!

// VarConst.java

public class VarConst{

	public static void main(String[] args){
		int x = 1;			// x는 변수, 대입된 1은 상수
		int y = 3;			// y는 변수, 대입된 3은 상수
		String name = "REDUCTO";	// name은 변수, 대입된 "REDUCTO"는 상수

		System.out.println(x);
		x = y;				// 변수에는 다른 변수 대입가능
		//3 = x;			// 당연하게 상수는 대입불가
		System.out.println(y);
		System.out.println(x);
		System.out.println(name);
	}

}

Compile, 실행해보면 다음과 같은 값을 얻을 수 있습니다!

 

1
3
3
REDUCTO

* "=" 기호는 오른쪽의 값을 왼쪽에 대입하라는 의미입니다! 자세한건 다다음 시간(연산자) 편에서 계속됩니다!

main이라는 글자가 있는 줄의 바로 아래쪽 int x=3; 이라는 코드가 있습니다. int라는 단어는 넘어가고 x=3이니, 이제 우리의 변수 x는 3이라는 상수값을 가지고 있는 것입니다!


변수 명명법

 

변수 이름은 프로그래머가 작성하기 나름입니다! 특정한 합이라는 이름을 짓고 싶으면 sum이라는 변수명을 정의해도 되고, 임시 값이라는 의미를 담고 싶으면 tmp라는 이름을 사용하는 것도 전통적인 방법입니다! 단 다음의 규칙은 지켜야 됩니다!

  • 대소자는 구분되며, 변수 이름 길이에 제한은 없다.(x와 X는 다른 변수)
  • 숫자로 시작할 수 없으며, 공백은 사용불가( 3x, tmp_dd dd는 사용 불가한 변 수명 임)
  • 변수에 허용되는 글자는 대소문자, 숫자, _(언더스코어), $만 허용됨
  • 예약어 사용불가(예약어는 프로그래밍 언어에서 미리 정해둔 문법적으로 의미 있는 단어를 의미합니다.)

다음의 단어들이 변수의 이름으로 사용될 수 있겠네요!

ex > tmp, _file_name, isSetted, onClose, SUMOFSET2, m3val2

 

예약어는 다음의 글을 참고해 주세요!

2021.08.14 - [JAVA] - JAVA 예약어 종류

 

JAVA 예약어 종류

_(언더스코어) : JAVA 9부터 예약어가 되었습니다.(이제 단독으로 언더스코어만쓰는 변수명은 불가하네영) abstract : 추상클래스를 지정하는 데 사용됩니다. assert : 강한 에러검출을 위한 키워드 bool

tutoreducto.tistory.com


이번 시간에는 프로그래밍이 무엇인지, 우리가 하려는 JAVA 프로그래밍이란 무엇인지, 프로그래밍에서 사용되는 변수나 상수가 무엇인지에 대해서 알아보았습니다. 다음 시간에는 자료형이라는 주제로 또 인사드릴게요!

프로그램은 컴퓨터라는 빈 도화지에 내가 원하는 그림을 그리는 예술과도 같은 행위입니다! 물론 일단 예술과는 다르게 이곳에서는 "컴퓨터의 언어와 문법"으로 이야기해야만 그림으로 쳐줍니다. 이번 시간에는 어느 프로그램잉나 입문으로 여겨지는 Hello World를 JAVA로 작성해 보고 JAVA이론적인 이야기 기를 해볼 겁니다! ECPLISE를 설치하지 않은 메모장 플레이어는 아래 [코드 보기]로 내려가 주세요!


ECPLISE

1. 우리의 ECPLISE를 켜고 다음의 코드를 입력해 주세요 HelloWorld라는 프로젝트를 만들어 주세요!

 

2. [New] - [class]로 새로운 JAVA class를 만들겠습니다. 아무것도 건드리지 말고 Name만 Hello로 지어주세요!

3. 우리의 도화지가 완성되었습니다! 코드를 실행할 때는 위에 초록동그라미인 Run을(단축키 : [F11]) 클릭한다는 거, 잊지 말아 주세요.

 

코드

public class Hello{
	public static void main(String[] args){
		System.out.println("Hello World!");
	}
}

우리의 영광스러운 첫 코드가 위에 모습을 드러냈습니다. 실행 후 Run 해보면 Console화면에(메모장이라면 DOS창에) Hello World!라는 글을 볼 수 있습니다! 잠깐 우리의 코드가 실행된, 그러니까 Hello라는 파일이 있는 곳으로 이동해 볼까요? ECPLISE라면 C\Users\[사용자명]\eclipse-workspace\[프로젝트명]의 위치에서 우리가 만든 Hello. java라는 파일을 찾을 수 있죠.

.java라는 확장자는 java 언어로 만든 파일의 "소스파일"임을 의미합니다. 소스파일은 자바 컴파일러(javac)를 통해서 실행 가능한 바이트코드(. class)로 변환되고 실행될 때는 JVM이라는 영역에서 실행됩니다. 아직은 이해가 안되도 상관없습니다. 이해하면 더 좋지만 JAVA와 친숙해지고 나서 동작원리를 이해해도 되요. 지금은 1. 이 JVM이라는거 덕분에 JAVA는 플랫폼독립적으로 동작할 수 있다는 점 2. 사람이 만든 소스파일(.java)는 컴파일러(javac)가 실행가능한 바이트코드(.class)로 변환시켜준다는 점 만을 알고 넘어가자고요.

 


이번 시간에는 JAVA로의 첫걸음을 떼는 Hello World를 코딩해보았고, JAVA의 기본원리를 알아보았습니다! 천리길도 한걸음부터이니 차근차근 배우시면 언젠가 어엿한 프로그래머로 성장한 자신의 모습을 보실 수 있으실 거예요! 다음 시간에는 JAVA코딩의 규약에 대해서 알아보도록 하겠습니다!

 

 

JAVA란 무엇인가?

썬 마이크로시스템즈에서 1995년에 개발한 객체 지향 프로그래밍 언어. 창시자는 제임스 고슬링이다. 
2010년에 오라클이 썬 마이크로시스템즈를 인수하면서 Java의 저작권을 소유하였다.

- 출처 : 나무위키 https://namu.wiki/w/Java#s-10 -

JAVA는 전 세계에서 통용되는 프로그래밍 언어로, 특유의 안정성과 JVM을 활용한 이식성을 높게 평가받아 세계 많은 컴퓨팅 기기에서 주력으로 활용되는 언어입니다! 최근은 JAVA 그 자체의 성능보다는 JAVA에서 제공하고, 파생되는 여러 가지 형태의 언어들(EX : KOTLIN)들이 그 영광을 이어서 가져오고 있습니다!

 


 

JAVA의 장점

 

1. 높은 이식성 : 프로그램을 만들 때는 그것을 해석하고 메모리에 올려줄 "해석 기관"이 필요합니다. 이 해석 기관은 OS별로 다르게 되는데, JAVA로 개발된 언어는 JAVA ByteCode로 변환되어, 해석기관인 JVM만 설치된 OS라면 어디서는 같은 환경으로 실행됩니다!

 

2. 낮은 진입장벽 : C나 C++등 저수준의 언어가 메모리 관리를 프로그래머가 직접 해주었던 거에 비해 JAVA는 가비지 콜렉터(Garbage Collector)라는 메모리 누수(Leak) 방지 기술로 메모리에 직접 접근해야 하는 번거로움을 줄어줍니다. 또한 타 언어에 비해 직관적인 문법이 JAVA의 낮은 진입장벽을 만드는 요소입니다.

 

- 출처 : JAVA의 장점 IBM Documentation https://www.ibm.com/docs/ko/aix/7.1?topic=monitoring-advantages-java- 

 

청소년 이용제한게임인 마인크래프트 역시 자바로 개발되었었습니다!

그럼 다음에는 자바를 설치 / 실행하는 방법에 대해서 알아보도록 하겠습니다!

 


Q. 당신 Python하는 사람 아니야?

A. 아! 네! 둘다 합니다! JAVA Python 말고도 다른 언어도 할 줄 압니다! 여러 가지 생각해봐서 JAVA보다 Python이 좋아요! 그거 쓰러 가세요!

 

Q. 갑자기 왠 JAVA인가요?

A. 최근 KOTLIN언어를 배웠습니다. 정말 매력적인 언어인데, JAVA를 이야기 하지 않고선 KOTLIN을 논할 수 없겠더라고요! 궁극적인 목표는 KOTLIN과 친해지기를 올리기 위해 JAVA와 친해지기를 올립니다!

+ Recent posts