시리즈:쉽게 배우는 프로그래밍 입문/Java: 두 판 사이의 차이

잔글 (Senior9324 사용자가 중급 프로그래밍 시리즈/Java 문서를 시리즈:중급 프로그래밍 시리즈/Java 문서로 옮겼습니다)
(차이 없음)

2015년 12월 4일 (금) 00:27 판

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

이 문서에는 독자적으로 연구한 내용이 들어갑니다. 다른 사람의 의견을 존중하면서 무례하지 않도록 작성해 주시고, 의견 충돌 시 토론 문서에서 토론해 주세요.

틀:중급 프로그래밍 항목

준비

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

객체지향

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


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

당연히도Hello, world!!

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

/** 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)[7] true | false
char 2[8] 유니코드 문자
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이 있다.

변수

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

변수명

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

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

메서드

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

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

반환값이 없는 메서드의 예이다. 자바는 멍청해서[17]변수 두 개를 한 번에 바꾸지 못하므로 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에서 띄워지는 반환 자료형을 잘 보고 쓰면 된다.

연산자

만만한 산술 연산자

/** 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이다.)
    }
}

관계 연산자

사실 boolean 연산자라 카더라

  • == : 두 피연산자가 같은 지 묻는 연산자이다.
  • != : 두 피연산자가 다른 지 묻는 연산자이다.
  • < : 왼쪽의 피연산자가 오른쪽보다 더 작은 지 묻는 연산자이다.
  • > : 왼쪽의 피연산자가 오른쪽보다 더 큰 지 묻는 연산자이다.
  • <= : 왼쪽의 피연산자가 오른쪽보다 작거나 같은 지 묻는 연산자이다.
  • >= : 왼쪽의 피연산자가 오른쪽보다 크거나 같은 지 묻는 연산자이다.
/** 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[18], for[19]등과 함께 쓰인다.

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
&& || ![20]
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("???");
        }
    }
}

대입 연산자

  • = : 왼쪽의 변수에 오른쪽의 을 대입한다.[21]
  • += : 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();
}

내일 와서 마저 써야지~

객체지향

주요 라이브러리

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