시리즈:쉽게 배우는 프로그래밍 입문/Java

문서의 내용이 너무 쉬워서 오늘부터 프로그래밍 할 수 있을 것 같습니다.

이 문서에는 독자적으로 연구한 내용이 들어갑니다. 다른 사람의 의견을 존중하면서 무례하지 않도록 작성해 주시고, 의견 충돌 시 토론 문서에서 토론해 주세요.
리브레 프로그래밍 시리즈
초급
프로그래밍
중급
프로그래밍
고급
프로그래밍
Python
협업

준비[편집 | 원본 편집]

우선 JDK[1]가 필요하다. 여기에서 최신의 것을 받아 쓸 수 있다. 더 준비할 필요는 없지만[2] 웬만해서는 IDE 쓰자. 다른 팀원들에게 피해일 수도 있다. 가능한 IDE에는 넷빈즈[3]이클립스[4], IntelliJ[5], JBuilder[6]가 있다. IDE를 설치하면 따로 설정을 더 할 필요도 없으니 IDE 쓰자.

VScode로도 자바 개발 환경 세팅을 할 수 있다.

비주얼 스튜디오에선 불가능하다.

객체지향[편집 | 원본 편집]

Write once, run anywhere. 이게 무슨 소리냐면 소스 코드를 한 번 작성하면 모든 곳에서 테스트할 수 있다는 거다.[7]

모든코드를 class 안에 넣는다. 이게 무슨 소리인가 하면 아래의 예제를 보자. 자바 코드에는 거추장스러운public class나 System.out과 같은 것이 붙어 있게 된다. 익숙해지면 망할C보다 편리하고 훨씬가독성이 높은 코드를 작성할 수 있다. 뭐, 이런 이론보다는 코드를 보면서 익히는 게 훨씬 나으니, 보면서 따라쓰자.

Hello, world!![편집 | 원본 편집]

콘솔 출력을 배울 수 있는 프로그램이다.[8] 뭔가를 하긴 했는데 그 결과가 제대로 나왔는지. 아니, 결과가 나오긴 하는지를 살펴 볼 때 필요한 것이므로 외우게 된다.착실히 이해하기 바란다.

/** Document : Hello.java
     @auther : wikineet
*/
public class Hello {
    public static void main(String[] args) {
        System.out.println("Hello, world!!");
    }
}

public class Hello에서 public은 "공개된" 클래스라는 의미로, import 구문으로 "이 클래스를 사용하겠다"라고 하면 어떤 경우에도 이 클래스를 사용할 수 있다. 그렇기 때문에 이 클래스가 public인 것. 안 그러면 컴파일러가 못 쓴다.

참고로 자바에선 파일 이름과 메인클래스 이름이 반드시 일치 되어야 한다. 따라서, 이 소스코드의 파일 이름은 "Hello.java"가 되어야 한다.

데이터 형식과 상수[편집 | 원본 편집]

거의 모든 프로그래밍 언어에는 데이터 형식이 있다. 자바에는 크게 2종류의 데이터 형식이 있다. 기본형과 참조형이 그것인데 기본형에는 8가지가 있다. 너무 많다고? 사실 short 같은 건 안 쓰기도 한다. 여하튼간에 그 8가지는

기본형
자료형 바이트 수(Byte) 표현 범위
부울형 boolean (1)[9] true | false
문자형 char 2[10] 유니코드 문자
정수 byte 1 -128 ~ 127
정수 short 2 -32768 ~ 32767
정수 int 4 -2147483648 ~ 2147483647
정수 long 8 -9223372036854775808 ~ 9223372036854775807
실수 float 4 1.4 * E-45 ~ 3.4028235 * E+38
실수 double 8 4.9 * E-324 ~ 1.7976931348623157 * E+308

자바에서 정수형 상수는 10진수(123456789), 16진수(0x23f479c5), 2진수(0b1011010101101101) 형태로 표기할 수 있다. 자바 7부터 숫자 상수 중간에 123_456_789 또는 3.141_592_653_589_793 과 같이 _ 을 사용할 수 있어서 긴 자리수의 숫자를 세 자리수마다 끊어서 표기할 수 있다. _ 는 10진수는 물론 2진수와 16진수 표기에도 사용할 수 있다. 따라서 0x23_f4_79_c5, 0b1011_0101_0110_1101 과 같이 사용하면 보다 읽기 쉽게 된다.

더 깊게 설명하자면 자바의 자료형은 Primitive(원시)와 Object(객체)로 나뉜다. Primitive는 말 그대로 원시적인 자료형이며 CPU의 레지스터에서 직접 처리할 수 있는 자료형을 말한다. 그리고 Object는 Primitive 이외의 모든것이다. 일반적으로 대부분의 자료형은 Object이며 제일 자주 쓰이는 Object 자료형으로는 java.lang.String이 있다.

참조형
종류 예시
배열 int [], float [], String []
클래스 String, Date
인터페이스 Runnable, Enumeration

참조형은 기본형과 다르게 변수를 직접 저장하는 것이 아니라 변수의 위치를 저장한다. C/C++로 치면 포인터와 역할이 비슷하다. 참조형 변수는 스택공간이라고 하는 부분에 저장되고 참조형 변수는 힙공간에 있는 자료들의 위치를 저장한다고 생각하면 된다. 스택공간에 집 주소를 적어놓는데 집의 위치가 힙 공간에 있다고 생각하면 된다. 모든 배열은 힙공간에 저장된다. 뒤에서 더 자세히 설명하고 일단 참조형은 new 키워드가 자주 따라다닌다는 것을 알아두자!

변수[편집 | 원본 편집]

변수 선언은 자료형 변수명;으로 선언할 수 있다.[11] 파이썬에서는 선언을 안 하더라. 사용만 하는 것 같다.[12] 이 때, 변수명에는 특정 기호가 들어갈 수 없는데[13] 그 특정 기호는 제어문자, 중괄호와 아래 연산자 부분에 나오는 기호들이다. 숫자의 경우, 맨 앞 글자에 숫자가 들어가면 그것은 수치로 인식되므로 주의하기 바란다. 또한 예약어라는 것이 있는데, 이것들은 사용하지 말기로 약속한 것이기 때문에 사용할 수 없다.

변수명[편집 | 원본 편집]

유니코드 문자 중 거의 대부분을 사용하여 만들 수 있지만 자바 사용자들의 암묵의 룰에 의해 보통 다음과 같이 사용된다.

  • 한 나라에서만 작업할 게 아니면 영어로 된 이름을 짓는다.[14]
  • 그 변수가 의미하는 것을 적절히 표현하는 이름을 짓는다.
  • 알파벳 소문자로 시작하며, 두 단어 이상일 때에는 첫 단어를 제외한 모든 단어의 머릿글자를 대문자로 짓는다.[15]이를 카멜 케이스(camel Case), 카멜 입력법이라 부른다. 단어의 머릿글자를 대문자로 짓는 것이 마치 낙타의 봉우리처럼 생겼다 하여 이렇게 부른다.[16]
  • 상수는 대문자로 지으며, 두 단어 이상일 때에는 띄어쓰기를 밑줄로 쓴다.
    int theAnswerToTheUltimateQuestionOfLife_TheUniverse_AndEverything = 42;
    char 如月 = 'H'; //그러니까 이렇게 쓰지 말라는 거다.(참고로 여월은 일본 인명으로 키사라기, 'H'는 아스키 코드로 72(...)이다.
    String hello = "Hello, world"; //Java의 참조형 자료형의 일종인 String이다. 자주 쓰이니 꼭 알아두길 바란다.

메서드[편집 | 원본 편집]

자바에서는 클래스에서 기능을 수행하는 함수를 메서드(Method)라고 부른다. 함수라고 해도 대부분 알아듣지만, 너무 쉽게 배운 티가 날 수도 있으므로 정확한 명칭을 써주는 것이 좋다. 메서드는 반환값, 입력값이 있다. (물론 없을 수 있긴 하다.) 메서드를 선언할 때에는 반환할 자료형 메서드의 이름(입력받을 자료형 입력받을 변수의 이름 ...)으로 선언하고[17][18], 그 내용을 채운다. [19]

/** 두 정수를 바꾸는 메서드
    @param Integer left right와 바꿀 것
    @param Integer right left와 바꿀 것
*/
void swap(Integer left, Integer right) //사실 이러면 주소만 바뀌지만, 뭐 어때? 바뀐 척만 하면 되지.
{
    Integer temp = left;
    left = right;
    right = temp;
}

반환값이 없는 메서드의 예이다. 자바는 멍청해서[20]변수 두 개를 한 번에 바꾸지 못하므로 temp 변수를 선언해서 사용해야 한다. 이처럼 메서드 안에서만 쓰이는 변수를 지역변수라고 한다. 이런 지역 변수는 당연하게도 그 지역 내(여기서는 메서드)에서만 사용한다. 지역 변수는 스택공간에 저장된다.

/** 두 수 중 더 큰 수를 반환하는 메서드
    @param int left right와 비교할 것
    @param int right left와 비교할 것
    @return int max 둘 중 더 큰 수
*/
int max(int left, int right)
{
    return left > right ? left : right; //연산자는 곧 배울 것이다.
}

반환값이 있는 메서드의 예이다. 가장 앞의 int가 보이는가? 반환할 자료형이다. 아마 이 작성자가 무지 싫어하는파이썬에는 이런 게 없어서 머리를 잘 굴려야 했다. 자바에서는 그런 거 없고 IDE에서 띄워지는 반환 자료형을 잘 보고 쓰면 된다.

메서드는 메서드 공간에 저장된다.

연산자[편집 | 원본 편집]

산술 연산자[편집 | 원본 편집]

  • +: 더이상 설명이 필요한지? 문자열 결합 연산자로도 쓰인다.
  • -: 하이픈 마이너스로 보이지만 뺄셈 연산자이다.
  • *: 아스테리스크로 보이지만 곱셈 연산자이다.
  • /: 슬래시로 보이지만 나눗셈 연산자이다.
  • %: 백분율 기호로 보이지만 나머지 연산자이다.
  • ++: C++변수에 1을 더한다. i = i + 1보다 i++가 바이트 코드가 더 짧다.
  • --: 변수에 1을 뺀다.
/** Document : ArithmeticOperators.java
    @auther : wikineet
*/
public class ArithmeticOperators {
    public static void main(String[] args) {
        int a = 5, b = 4;

        System.out.println("5 + 4 = " + (a + b)); // 5 + 4 = 9
        System.out.println("5 - 4 = " + (a - b)); // 5 - 4 = 1
        System.out.println("5 * 4 = " + (a * b)); // 5 * 4 = 20
        System.out.println("5 / 4 = " + (a / b)); // 5 / 4 = 1 (C를 비롯한 여러 프로그래밍 언어는 정수 나눗셈에서 버림한다.)
        System.out.println("5 % 4 = " + (a % b)); // 5 % 4 = 1 (a / b * b + a % b = a이다.)
    }
}

관계 연산자[편집 | 원본 편집]

  • == : 두 피연산자가 같은 지 묻는 연산자이다.
  • != : 두 피연산자가 다른 지 묻는 연산자이다.
  • < : 왼쪽의 피연산자가 오른쪽보다 더 작은 지 묻는 연산자이다.
  • > : 왼쪽의 피연산자가 오른쪽보다 더 큰 지 묻는 연산자이다.
  • <= : 왼쪽의 피연산자가 오른쪽보다 작거나 같은 지 묻는 연산자이다.
  • >= : 왼쪽의 피연산자가 오른쪽보다 크거나 같은 지 묻는 연산자이다.
/** Document : RelationalOperators.java
    @auther : wikineet
*/
public class RelationalOperators {
    public static void main(String[] args) {
        int a = 5, b = 4;

        System.out.println("5 == 4 : " + (a == b));
        System.out.println("5 != 4 : " + (a != b));
        System.out.println("5 < 4 : " + (a < b));
        System.out.println("5 > 4 : " + (a > b));
        System.out.println("5 <= 4 : " + (a <= b));
        System.out.println("5 >= 4 : " + (a >= b));
    }
}

보통 if[21], for[22]등과 함께 쓰인다.

int 如月 = 72;

if(如月 > 80) {
    System.out.println("Plus 80");
}
else if(如月 > 75 {
    System.out.println("Plus 75");
}
else {
    System.out.println("큿");
}

비트 연산자[편집 | 원본 편집]

요즘엔 0bxxx로 이진수를 쓸 수 있게 되어서 쓰...나?

  • & : 앰퍼센드보다는 앤드로 알고 있는 사람이 많다. 물론 이 때는 And 연산자.
  • | : 이거 어디 있는지 못 찾는 위키러가 많은데, ⇧ Shift+\이다. Or 연산자.
  • ^ : a = a ^ b; b = a ^ b; a = a ^ b;두 수를 바꿀 때 쓰는 연산자이다. Xor연산자. 자세한 것은 XOR 문서 참조.
  • ~ : 비트반전 연산자. ~[math]\displaystyle{ 1001101_2 = 0110010_2 }[/math]
  • << : [math]\displaystyle{ 00110101_2 }[/math] << [math]\displaystyle{ 2 = 11010100_2 }[/math]
  • >> : [math]\displaystyle{ 10110101_2 }[/math] >> [math]\displaystyle{ 2 = 11101101_2 }[/math]
  • >>> : [math]\displaystyle{ 10110101_2 }[/math] >>> [math]\displaystyle{ 2 = 00101101_2 }[/math]

쓰는 걸 못 봐서 예제를 만들지는 않겠다. '~'를 제외하면 모두 2항연산자이다.

논리 연산자[편집 | 원본 편집]

  • && : And
  • || : Or
  • ! : Not
&& || ![23]
true true true true false
true false false true false
false true false true true
false false false false true
/** Document LogicalOperators.java
    @auther : wikineet
*/
public class LogicalOperators {
    public static void main(String[] args) {
        int chiruno = 10;
        int kisaragi = 73;

        if((chisuno == 9) && (kisaragi == 72)) {
            System.out.println("OK");
        }
        else {
            System.out.println("???");
        }
    }
}

대입 연산자[편집 | 원본 편집]

  • = : 왼쪽의 변수에 오른쪽의 을 대입한다.[24]
  • += : a += 2는 a = a + 2와 같은 식이다. 자매품으로 -=, *= 등이 있다.

기타 연산자[편집 | 원본 편집]

주요 예약어[편집 | 원본 편집]

일단 앞에서 살펴 본 자료형이 있다.

boolean, char, byte, short, int, long, float, double은 int i;또는 int i = 0;으로 쓰이고, 배열로 쓸 때에는 int[] i = {0, 1, 2, 3, 4}으로 쓰인다. 쓰임새는 당연히 변수 할당.

조금 뒤에 나오는 객체지향에서 쓰이는 예약어가 있다. 클래스와 패키지에 관련되어 있는데, 소스로 살펴보자.

/** Document : OOP.java
    @auther : wikineet
*/

package net.librewiki.easyJava;

import java.lang.String; //자바 프로그래머에게는 '저, 신경쓰여요!'겠지만, 예제는 예제일 뿐이다.

public class OOP extends Father implements Mather {
    public OOP(String name) {
        super(name);
    }
    public void speak() {
        System.out.println(name);
    }
    public static void main(String[] args) {
        OOP me = new OOP("wikineet");
        if(me instanceof Mather) {
            me.speak();
        }
    }
}

class Father {
    public String name;
    public Father(String name) {
        this.name = name;
    }
}

interface Mather {
    public void speak();
}

배열[편집 | 원본 편집]

배열은 여러 변수를 만들어 연속적으로 이어진 형태의 자료형이다. 변수 a1, a2, a3 같이 비슷한 변수들이 여러 개가 필요하다면 이것을 a 하나로 묶어주고 몇 번째 a인지를 대괄호에 적어 a[1], a[2], a[3] 이렇게 표현할 수 있다. 또한 이 장점만 있는 것이 아니라 반복문으로 배열의 각 요소들을 꺼내어 이용할 수 있다는 점이다.

객체지향[편집 | 원본 편집]

객체지향은 절차지향에서처럼 함수로 자료들을 조작해서 결과를 도출하는 것이 아닌 손과 발이 달린 자료를 이용해서 자료들끼리 상호작용을 통해서 결과를 도출하는 방식을 말한다.

객체[편집 | 원본 편집]

손과 발이 달린 자료들을 객체라고 부르고 이 객체들을 찍어내는 것을 클래스라고 생각하면된다. 모든 객체들은 필드와 메서드를 가지고 있다.

C언어의 구조체와의 차이
흔히 클래스와 객체의 관계를 빵틀과 빵의 관계로 설명하기도 하는데 그것은 겨우 변수만 딸린 수준의 C언어의 구조체를 설명하는데 더 어울리는 표현이다. 수동적으로 나는 이런 자료들을 가지고 있어요라고 하는 구조체와는 달리 능동적으로 자기 자신의 변수들을 조작하거나 출력할 수 있기 때문에 클래스와 객체를 공장과 로봇으로 비유하는 것이 더 와닿지 않을까 한다. 예를 들어 구조체/객체 내의 변수를 출력하는 프로그램을 만들었다면 절차지향에선 함수를 이용해서 구조체의 변수들에 접근해서 출력하면 되는데 객체지향이 가능하다면 객체 내의 함수(메서드)를 이용해서 객체의 변수를 출력할 수 있다. 구조체의 변수는 Print(구조체->변수)이렇게 출력하게 되고, 객체의 변수는 객체.print(변수)가 된다. 구조체가 두 종류가 있게 되면 다른 이름의 Print() 함수를 두 개 만들게 되고 객체가 두 개라면 print() 함수를 각 클래스에서 만들어주면 되므로 쓸 이름이 소진되는 현상도 막을 수도 있다. 그 외에도 생산성이 더 증가한다는 점이 객체지향의 장점이다. 객체지향이 없으면 자바를 쓸 이유가 없게 된다. 이 강력한 도구에 익숙해져보자.

주요 라이브러리[편집 | 원본 편집]

java.lang[편집 | 원본 편집]

java.math[편집 | 원본 편집]

java.util[편집 | 원본 편집]

기타 예약어[편집 | 원본 편집]

멀티스레딩[편집 | 원본 편집]

GUI[편집 | 원본 편집]

java.awt[편집 | 원본 편집]

javax.swing[편집 | 원본 편집]

javafx[편집 | 원본 편집]

IO[편집 | 원본 편집]

java.io[편집 | 원본 편집]

java.nio[편집 | 원본 편집]

네트워킹[편집 | 원본 편집]

JavaEE[편집 | 원본 편집]

먼저 HTML/CSS/JavaScript는 다 떼고 오는 것이 좋다. 그리고 항목이 너무 길어질 수 있어 분리하겠다. 여기로.

각주

  1. Java Developement Kit
  2. 간단한 텍스트 편집기(ex:notepad)와 javac를 실행할 수만 있으면 된다.
  3. netbeans.org
  4. eclipse.org
  5. www.jetbrains.com/idea/ IntelliJ는 Android Studio의 베이스 프로젝트이기도 하다. Ultimate와 Community Edition이 있는데 CE는 오픈소스 프로그램이다
  6. JBuilder는 상용 프로그래밍이므로 쓸 거면 사서 쓰자.
  7. 어차피 윈도우만 지원해 주면 되거든... 리눅스지못미
  8. 왜 이런 걸 배워야 하는 지 모르겠다면 쭉 내려가서 GUI 부분을 찾아보고 오길 바란다.
  9. 1 비트면 충분하지만 어른의 사정으로 인해 1 바이트가 되었다.
  10. 아스키 코드 뿐만 아니라 유니코드도 지원한다!!
  11. C언어 기반의 언어들 대부분이 그렇다.
  12. 코드가 꼬이기에 적합한 환경이다. 사용하기도 쉽고 헤메기도 쉽다.
  13. 알파벳과 밑줄, 그리고 숫자만이 들어갈 수 있다고 한다.
  14. 한국에서만 작업할 것이라면 한글로 이름지어도 좋다.
  15. 함수에도 적용된다.
  16. 단, 상수는 아예 대문자로 입력하고(TODAY_TIME) 스네이크 케이스 (SNAKE_CASE) 방법을 사용한다. 스네이크 케이스는 언더바 _ 를 띄어쓰기 대신에 적용하는 것이다.
  17. 파이썬보다 어려워 보이지만, 반환할 자료형이나 입력받을 자료형이 명시되어 사용하기에는 편리하다.
  18. 물론 매개변수를 여러 종류로 입력받고 싶다면 생노가다... 였으나. 가변인자템플릿이 나와서 코딩 노가다를 줄여준 대신 머리를 겁나 굴리게 했다.주었다.
  19. 특별한 경우로, abstract 키워드를 붙이면 내용을 채우지 말아야 한다.
  20. 사실 Java만 그런건 아니고 소수의 언어만 변수 스와핑을 지원한다
  21. 조건문을 사용할때 사용
  22. 반복문 사용시 사용되며 while, do~while 이 있다.
  23. 앞의 것
  24. 변수 하나, 상수 하나도 식이다.
  25. a와 b중 작을 수를 얻는다.