코딩 뚝딱이

Java 독학하기 2일차: 점프 투 자바 02장 자바 시작하기 본문

Java

Java 독학하기 2일차: 점프 투 자바 02장 자바 시작하기

Desiree 이나 2023. 11. 3. 14:33

02장 자바 시작하기

02장에서는 자바 프로그래밍을 처음 접하는 사람들이 알아야할 기본 지식을 다룬다. 자바 코드의 구조, 변수와 자료형, 클래스나 메서드 등의 이름 짓는 규칙, 그리고 주석을 배워보자. 


02-01 자바 코드의 구조 살펴보기

자바 코드의 구조를 알아보자. 일반적으로 자바 코드는 다음과 같은 형태로 작성한다. 

/* 클래스 블록 */
public class 클래스명 {

    /* 메서드 블록 */
    [public|private|protected] [static] (리턴자료형|void) 메서드명1(입력자료형 매개변수, ...) {
        명령문(statement);
        ...
    }

    /* 메서드 블록 */
    [public|private|protected] [static] (리턴자료형|void) 메서드명2(입력자료형 매개변수, ...) {
        명령문(statement);
        ...
    }

    ...
}

 

자바 코드의 가장 바깥쪽 영역은 클래스 블록이다. 클래스명은 사용자 마음대로 지을 수 있다. 단, 클래스명은 소스 파일의 이름(예; 클래스명.java)과 똑같이 사용해야 한다. 그리고 클래스 블록은 여러 메서드 블록을 포함한다. 

public 클래스는 아래에서 더 자세하게 알 수 있다. public 클래스가 헷갈린다면 아래 더보기를 꼭 보길 추천한다!

 

☆☆☆☆ ↓ 더 보 기 ↓ ☆☆☆☆

더보기

public 클래스

 

여기서는 클래스를 작성할 때 약간 혼란스러울 수 있는 부분을 설명하려고 한다. 

class와 public class의 차이점에 대해서 알아보자.

 

다음과 같은 클래스 파일을 MyProgram.java라는 이름으로 작성해 보자. 

 

MyProgram.java

class MyProgram{
}

 

이상없이 잘 컴파일이 된다.

위 소스 파일에 다음과 같이 클래스를 하나 더 추가해 보자.

class MyProgram{
}

class MyProgram2{
}

 

역시 이상없이 잘 컴파일이 될 것이다. 

다시 다음과 같이 수정해 보자.

class MyProgram{
}

public class MyProgram2{
}

MyProgram2라는 클래스 앞에 public이라는 키워드를 붙였더니 이번에는 컴파일 에러가 발생했다.

다시 다음과 같이 수정해 보자.

public class MyProgram{
}

class MyProgram2{
}

MyProgram2 클래스 앞에 public 키워드를 제거하고 MyProgram 앞에 public 키워드를 추가하였다. 

 

이번에는 컴파일이 잘 될 것이다.

 

이렇게 되는 이유는 파일명(MyProgram.java) 때문이다. 클래스명 앞에 public 키워드를 추가하면 그 클래스의 이름은 파일명과 동일해야만 하는 규칙이 있기 때문이다. 

 

그렇다면 자바는 왜 이런 규칙을 만들었을까?

 

스택오버플로우의 추천수가 많은 답변 중 하나는 다음과 같다...^^;

"제임스고슬링이 그렇게 하라고 했기 때문"

 

보통 이렇게 하나의 자바파일에 여러개의 클래스를 작성하는 경우에는 하나의 대표 클래스를 지정하고 파일명과 동일하게 하는 것이 코드의 가독성에 도움이 된다고들 말한다. 

 

이제 우리는 소스코드를 읽을 때 public 키워드가 부터있는 class를 보게 된다면 현재 소스코드가 어떤 자바파일명으로 저장되어 있는지 알 수 있을 것이다. 또한 public 키워드가 없는 경우라면 자바 파일명과 클래스명이 일치하지 않을 수 있다고 생각하면 될 것이다. 

 

이제 메서드 블록을 살펴보자.

 

[public|private|protected] 는 public, private, protected가 오거나 아무것도 오지 않을 수 있다는 의미이다. public, private, protected는 메서드의 접근. 제어자이다. 

접근 제어자는 07-02절에서 자세히 다룬다.

 

[static] 은 static 키워드가 올 수도 있고 오지 않을 수도 있다는 의미이다. static이라는 키워드가 붙으면 static 메서드가 된다.

static 메서드는 07-03절에서 자세히 다룬다.

 

(리턴 자료형|void) 는 메서드가 실행된 후 리턴되는 값의 자료형을 의미한다. 리턴값이 있을 경우에는 반드시 리턴 자료형을 표기해야 하며, 만약 리턴값이 없는 경우라면 void로 표기해야 한다. 이 항목은 void 또는 리턴 자료형이 반드시 있어야만 한다(그래서 [] 대신 ()로 표시했다).

 

메서드명은 자유롭게 지을 수 있다. 메서드명 뒤에 이어지는 괄호 안의 값들(입력자료형, 매개변수 등)은 메서드의 입력 인자를 뜻한다. 입력 인자는 '입력자료형+매개변수명' 형태로 이루어지며 개수에 제한이 없다. 클래스 내에는 이러한 메서드를 여러 개 만들 수 있다. 


속성과 생성자 이해하기

 

자바 코드에는 속성과 생성자도 구성 요소로 포함된다. 속성과 생성자는 05장에서 자세히 다루므로 여기서는 간단히 살펴보자.

public class Sample{

	/* 속성 */
    private String message;
    
    /* 생성자 */
    public Sample(String message) {
    	this.message = message
    }
}

 

속성은 클래스의 상태를 나타내는 변수로, 클래스 내부에 선언된다. 생성자는 클래스 인스턴스를 생성할 때 실행되는 메서드로, 주로 속성을 초기화하는 용도로 사용한다.


 자바 코드의 예 

간단한 예로 자바 코드의 구조를 더 자세히 알아보자. 

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

 

1. 클래스 블록

자바 코드의 가장 바깥쪽 영역인 클래스 블록을 보자. 클래스 블록은 중괄호({})로 둘러싸야 한다.

public class Sample{
	(... 생략 ...)
}
여기서 클래스명은 Sample이다.

 

public은 자바의 접근 제어자로, 어디서든 이 클래스에 접근할 수 있음을 의미한다. class는 클래스 블록을 만드는 키워드이다.

 

2. 메서드 블록

메서드 블록은 클래스 블록 안에 있으며 역시 중괄호({})로 영역을 구분한다. 

public class Sample{

	public static void main(String[] args) {
    	(... 생략 ...)
    }

}
이 메서드의 이름은 main이다.

 

클래스 블록 안에는 메서드 블록이 여러개 있을 수 있다. 메서드 블록에서 사용하는 public, static, void 등은 7장에서 자세히 다루므로 여기서는 간단히 알고 넘어가자.

  • static: 메서드에 static 키워드가 붙으면 클래스 메서드가 되어 객체를 만들지 않아도 '클래스명.메서드명' 형태로 호출할 수 있다.
  • void: 메서드의 리턴 자료형으로, void는 리턴값이 없음을 의미한다.
  • String[] args: 메서드의 매개 변수로, args 변수는 String[] 배열 자료형임을 의미한다. args는 argument의 줄임말로, 인수를 의미한다. args 대신 다른 이름을 사용해도 상관없다. 
인수는 메서드에 전달하는 입력값을 말하며, 05-03절에서 자세히 다룬다.

 

3. 명령문

메서드 블록 안에는 명령문이 있다. 컴퓨터에 무언가 일을 시키는 문장을 명령문(statement)이라고 한다.

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

 

명령문은 반드시 세미콜론(;)을 붙여 문장이 끝났다는 것을 표시해야 한다. 메서드 블록 안에는 명령문이 여러개 있을 수 있다. 


02-02 변수와 자료형

이번에는 자바의 변수와 자료형을 차례로 알아보자. 

 

변수는 흔히 값을 넣을 수 있는 빈 상자와 같다고 표현한다. 즉, 변수는 값을 대입하여 사용할 수 있다. 그리고 값에는 어떤 형태가 정해져야 하는데, 이 형태가 바로 자료형이다. 다음은 변수와 자료형을 나타낸 예제이다. 한번 가볍게 살펴보고 본격적으로 내용을 익혀 보자.

int a;

 

 변수 알아보기 

다음 a, b를 변수(variable)라고 한다.

int a;
String b;

 

이때 변수 이름은 프로그래머가 마음대로 지정할 수 있다. 앞의 예처럼 a,b로 지을수도 있고 다음처럼 one, two로도 정할 수 있다.

int one;
String two;

 

변수 이름을 지을 때는 3가지 규칙을 따라야 한다. 

  • 변수명은 숫자로 시작할 수 없다.
  • _ 와 $ 이외의 특수 문자는 사용할 수 없다.
  • int, class, return 등 자바의 키워드는 변수명으로 사용할 수 없다.

다음은 변수명을 잘못 사용한 예이다.

int 1st;       // 변수명은 숫자로 시작할 수 없다.
int a$;        // 변수명에 특수 문자를 사용할 수 없다. ( _ , $ 제외)
int class;     // 키워드를 변수명으로 사용할 수 없다.

 


자바의 키워드 알아 두기

 

변수명을 정할때 반드시 피해야 하는 자바의 키워드는 다음과 같다.

abstract continue for new switch
assert default goto package synchronized
boolean do if private this
break double implements protected throw
byte else important public throws
case enum instanceof return transient
catch extends int short try
char final interface static void
class finally long strictfp volatile
const float native super while

 자료형 알아보기 

변수명 앞의 int, String 등은 변수의 자료형(type)을 뜻한다. 앞서 살펴본 int a; 라는 코드는 다음과 같이 해석된다. 

int a;     // 변수 a의 자료형은 int이다.

 

이때 a라는 변수에는 int 자료형 값으로 1, 10, 25 등의 정수만 담을 수 있다. 

이어서 String b; 라는 코드는 다음과 같이 해석된다.

String b;     // 변수 b의 자료형은 String이다.

 

이때, b라는 변수에는 String 자료형 값으로 "a", "hello" 등의 문자열만 담을 수 있다. 

 변수에 값 대입하기 

변수를 선언한 후에는 변수에 값을 대입할 수 있다. 이때 = 기호를 사용한다. 각 문장은 다음과 같이 해석된다.

int a;
String b;

a = 1;                // int 자료형 변수 a에 1이라는 값을 대입
b = "hello java";     // String 자료형 변수 b에 "hello java"라는 값을 대입
= 은 대입 연산자(assignment operator)라고 한다.

 

또한 다음과 같이 변수를 선언함과 동시에 값을 대입할 수도 있다. 

int a = 1;
String b = "hello java";

 


int 자료형 변수에 문자열을 대입하면 어떻게 될까?

 

만약 int 자료형 변수인 a에 문자열을 대입하면 어떻게 되는지 알아보자.

int a = "Hello java";

 

IDE에서는 다음과 같은 오류 메세지를 보여준다. 이 메세지는 String 자료형을 int 자료형으로 변경할 수 없다는 뜻이다.

Type mismatch: cannot convert from String to int

 자주 쓰이는 자료형 

int, String 외에 자바에서 가장 많이 사용하는 자료형을 알아보자.

  • int
  • long
  • double
  • boolean
  • char
  • String
  • StringBuffer
  • List
  • Map
  • Set

예를 들어 StringBuffer, List 자료형에 해당되는 변수는 다음과 같이 만들 수 있다. 각 문장은 다음과 같이 해석된다.

StringBuffer sb;  // sb 변수의 자료형은 StringBuffer로, sb 변수에는 StringBuffer 자료형에 해당하는 값만 대입 가능
List myList;      // myList 변수의 자료형은 List로, myList 변수에는 List 자료형에 해당하는 값만 대입 가능
03장에서 자료형에 대해 더 자세히 다룬다.

 

 사용자 정의 자료형 

뒤에서 자세하게 공부하겠지만 사용자가 자료형을 직접 만들 수도 있다. 예를 들어 Animal이라는 클래스를 만들었다고 가정해 보자.

class Animal{
}

 

Animal 클래스를 만들었다면 다음과 같이 Animal이란 자료형의 변수를 만들 수 있다. 이 코드는 다음과 같이 해석된다.

Animal cat;  // cat 변수의 자료형은 Animal이며, cat 변수엔 Animal 자료형에 해당하는 값만 대입 가능

 

자료형과 클래스의 관계는 05장에서 더 자세히 알아볼 것이다. 사용자 정의 자료형은 이렇게 만들 수 있다는 정도만 알아두자.


02-03 이름 짓는 규칙

자바 코드를 작성하면서 클래스, 메서드, 변수 등의 이름을 지을 때 개발자들이 가장 고민한다. 하지만 규칙을 알아두면 부담을 크게 줄일 수 있다. 여러 사람이 프로그래밍할 때 코드를 서로 다른 스타일로 작성한다면 알아보기 힘드므로 가이드를 정한 것이다. 

 클래스 이름 짓기 

자바 클래스를 만들려면 먼저 이름을 지어야 한다. 자바 클래스의 이름은 사실 아무렇게나 지어도 되지만 다음과 같은 규칙이 있다.

  • 클래스명은 명사로 한다.
  • 클래스명은 대문자로 시작한다.
  • 여러 개의 단어를 조합하여 만들 경우 각 단어의 첫 번째 글자는 대문자이어야 한다. 이를 파스칼 케이스(pascal case)라고 한다.

규칙에 따른 클래스명의 예는 다음과 같다.

class Cookie {}
class ChocoCookie {}

 

 메서드 이름 짓기 

메서드명은 보통 다음과 같은 규칙을 따른다.

  • 메서드명은 동사로 한다.
  • 메서드명은 소문자로 시작한다.
  • 여러 개의 단어를 조합하여 만들 경우 맨 첫 글자를 제외한 나머지 단어의 첫 글자는 대문자를 써서 구분한다. 이를 카멜 케이스(camel case)라고 한다.

메서드명의 예를 살펴보자.

run();
runFast();
getBackground();

 

 변수 이름 짓기 

앞서 02-02절에서 잠깐 언급했지만 변수명은 다음 규칙을 따른다.

  • 변수 이름은 짧지만 의미가 있어야 한다. 즉, 변수명만 봐도 사용한 이유를 알 수 있게 지어야 한다.
  • 순서를 의미하고 임시로 쓰이는 정수의 변수명은 i, j, k, m, n을 사용한다. 문자의 경우는 c, d, e 등을 사용한다.
  • 변수명에 _ , $를 쓸 수 있지만 시작 문자로 사용하는 것은 지양하자.

변수명의 예를 살펴보자.

String userName;
float lineWidth;
int i;   // 주로 반복문에서 사용
char c;  // 주로 반복문에서 사용

 


02-04 주석이란?

자바 코드에 프로그래머의 의견이나 코드의 설명을 적을 수 있는데 이것을 주석(comment)이라고 한다. 주석은 프로그램 코드에 삽입하더라도 프로그램을 수행하는 데 전혀 영향을 끼치지 않는다. 왜냐하면 컴파일할 때 주석은 자동으로 바이너리 코드에서 제거되기 때문이다. 

 

자바에는 블록 주석과 라인 주석 이렇게 두 가지 형태가 있다. 

 블록 주석 

/* 가 블록 주석의 시작이고 */ 가 블록 주석의 끝이다. 블록 주석은 코드에서 블록 단위(클래스, 메서드 등)로 설명할 때 주로 사용한다.

/*
프로그램의 저작권

이 프로그램의 저작권은 Desiree이나에게 있습니다.
Copyright 2023.
*/
public class MyProgram {
    ...

 

 라인 주석 

라인 주석은 // 기호를 사용하는데, // 가 시작된 곳부터 그 라인의 끝까지 주석문이 된다. 보통 특정 코드 한 줄을 설명할 때 라인 주석을 사용한다. 

int age;  // 동물의 나이

 

 주석 올바르게 사용하기 

1. 적절하지 못한 주석

다음 예처럼 누구나 알 만한 내용의 주석은 코드를 지저분하게 만들기 때문에 쓰지 않는 게 좋다.

 

2. 주석을 사용할 때 이런 점은 주의하자

코드가 바뀌면 주석 내용도 업데이트해야 한다. 코드에 달린 엉뚱한 주석문은 코드를 읽는 다른 사람에게 큰 혼란을 줄 수 있으므로 업데이트하는 것을 잊지 말자!

코드는 수정했는데 바쁘거나 귀찮아서 주석문을 미쳐 수정하지 않을 때가 종종 있으니 주의하자!

 

3. 임시 백업을 위한 주석

작성한 코드의 특정 부분을 잠시 사용하지 않게 만들고 싶을 때에도 주석을 사용한다. 예를 들어 좀 더 업그레이드된 코드를 작성하고 싶을 때 기존 코드를 삭제하지 않고 잠시 주석 처리를 하고 새로운 카드를 작성하면 편리하다. 주석 처리한 기존 코드를 참고할 수도 있고, 기존 코드로 쉽게 돌아갈 수도 있기 때문이다. 


주석이 적은 코드와 많은 코드, 어떤 게 좋은 코드일까?

 

어떤 사람은 주석이 없는 코드가 좋은 코드라고 한다. 하지만 이 말을 오해하지 말자. 주석이 없는 코드가 아니라 주석이 있을 필요가 없을 정도로 이해하기 쉽고 누가 봐도 명확한 코드를 말하는 것이다. 이런 코드를 심플 코드(simple code)라고 한다. 

 

XP(Extreme Programming)의 창시자 중 한 명인 론 제프리즈(Ron Jeffries)는 심플 코드를 '동작하는 깨끗한 코드(Clean code that works)'라고 정의했다. '동작하는 깨끗한 코드'는 이상적인 코드라고 할 수 있다. 하지만 내용이 불분명하고 도저히 이해할 수 없는 코드, 또는 헷갈리기 쉬운 부분에도 주석은 꼭 필요하다. 주석은 이해하기 어려운 곳에 주로 작성되기 때문에 '주석이 필요하다면 좋은 코드가 아니다'라는 말이 나온 것이므로, 심플 코드를 작성할 수 없다면 주석은 어쩔 수 없이 사용해야 한다.


 


2장 여기서 끝 !!

3장은 다음 게시물에서 만나요!!