JAVA

자바 - 나무보다 숲을 보자(1)

홍콩판다 2019. 5. 19. 14:32

자바는 책도 그렇고 정말 방대하다 

그래서 각 단원의 내용만 부랴부랴 실습하다가

여태껏 숲이 아닌 나무만 보며 공부해왔다는 걸 깨닫고

숲을 보기 위해 생활코딩 사이트의 Java 부분을 하루 동안 정주행하려고 한다

이 포스트의 내용은 위 사이트의 내용을 가져온 것이다

 

컴파일 : javac hello.java
소스 코드 -> 바이트 코드 class 파일
실행 : java hello
class파일 -> Java Virtual Machine에서 실행

변수의 타입에 따라 사용하는 메모리의 크기가 다르다.
정수를 저장할 때는 int(4byte)를 사용하는 것을 권장 (CPU처리속도
가 빠름, 수의 범위가 충분히 큼)
실수를 저장할 때는 double(8byte)을 사용하는 것을 권장
문자 char (2byte) 문자열 String (글자당 2byte)
※문자열 : 포인터 객체 - 힙 메모리 상에 위치 : 크기의 한계가 존재함

 

float a = 2.2; //상수 2.2는 double형 -> 에러 발생
float a = 2.2F; 
double a = 2.2;

int a = 2147483648; //에러 : 정수 표현 범위 초과
long a = 2147483648; // 상수 2147483648가 int형이기 때문에 여전히 에러
long a = 2147483648L;
byte, short 타입에는 int형 상수를 대입할 수 있다
byte a = 100; 
short b = 200; 

 

데이터(값)의 형식에 따라 저장되는 방식이 다르다 
-> 서로 다른 형식의 데이터를 연산하려면 하나의 형식으로 통일해야 한다
-> 형 변환(implict Conversion)
자동 형 변환 
double a = 3.0F; //float형 상수가 double형으로 자동 변환됨 (double의 표현 범위가 더 크기 때문)
float a = 3.0; // double형 상수를 float형으로 변환할 수 없음
원칙 : 표현범위가 넓은 데이터 타입으로의 변환만 허용된다
int a = 3;
float b = 1.0F;
double c = a + b;
//a+b를 하기 위해 int형 a를 float형으로 바꾸는 형변환, 그렇게 연산한 결과인 float형의 a+b를 double형으로 바꾸는 형변환이 일어난다
명시적 형 변환
float a = 3.0; -> float a = (float) 3.0; 
(데이터 타입) 데이터 값 
*** 자바는 정수형 연산을 진행할 때, 모든 피연산자를 int형 데이터로 변환하는 과정을 거친다. 즉, short형과 byte형은 int형으로 변환되어 연산되므로 정수형을 저장할 때 int를 권장한 것.

 

단항 연산자
        int i = 3;
        i++;
        System.out.println(i); // 4 출력
        ++i;
        System.out.println(i); // 5 출력
        System.out.println(++i); // 6 출력 
        System.out.println(i++); // 6 출력
++i : i를 1 증가시킨 후에 값이 사용됨
i++ : i의 값이 사용된 후에 1 증가시킴

true/false의 값을 갖는 boolean
비교(관계) 연산의 결과 -> boolean 형 
1==2 (false) 4==4 (true)
1!=2 (true) 3!=3 (false)
2>3 (false) 3<5 (true)
4>=1 (true) 2>=3 (false)
"hello"=="hello" (true) "hello"=="Hello" (false)
a="hello"; a.equals("hello") (true)

 

if문 
조건식 : true/false를 갖는 boolean형 
괄호 안의 조건식이 true일 때 통과
예제
public class LoginDemo {
    public static void main(String[] args) {
        String id = args[0];
        if(id.equals("egoing")){
            System.out.println("right");
        } else {
            System.out.println("wrong");
        }
    }
}

입력값을 전달하는 방법
java LoginDemo egoing  (명령프롬프트)

eclipse에서 arguments를 넣는 방법

이렇게 지정했을 때 args[0]은 abcd, args[1]은 morning, args[2]는 egoing이 된다

 

 

 

중첩 if문 

예제
public class LoginDemo2 {
    public static void main(String[] args) {
        String id = args[0];
        String password = args[1];
        if (id.equals("egoing")) {
            if (password.equals("111111")) {
                System.out.println("right");
            } else {
                System.out.println("wrong");
            }
 
        } else {
            System.out.println("wrong");
        }
    }
}
//id.equals("egoing")이 true -> password.equals("111111")이 true일 때 
right가 출력되고 그 외에는 wrong이 출력됨. 

 

switch(값)
 case 값 : 명령문; break;

break를 만나야 케이스에 해당하는 것만 실행된다

default: 명령문 ;
케이스에 해당되지 않을 때 실행된다

switch의 조건값으로 사용할 수 있는 것들
byte, short, char, int, enum, 
String, Character, Byte, Short, Integer ==> Wrapper Class 객체로 사용하기 위한...

Wrapper Class 와 Boxing, Unboxing↓

http://tcpschool.com/java/java_api_wrapper

 

논리 연산자
예제를 응용해봤다

class AndDemo {

	public static void main(String[] args) {
		
		boolean a = 1>2;
		System.out.println(a);
		boolean b = 3>2;
		System.out.println(b);
		if (a&&b) {
			System.out.println(1);
		}

		if (a&&(!b)) {
			System.out.println(2);
		}

		if (!a&&b) {
			System.out.println(3);
		}

		if ((!a)&&(!b)) {
			System.out.println(4);
		}

	}

}

if의 조건식을 a||b  a||!b 처럼 바꿔쓸 수 있다

예제

public class LoginDemo4 {
    public static void main(String[] args) {
        String id = args[0];
        String password = args[1];
        if ((id.equals("egoing") || id.equals("k8805") || id.equals("sorialgi"))
                && password.equals("111111")) {
            System.out.println("right");
        } else {
            System.out.println("wrong");
        }
    }
}

//id는 egoing, k8805, sorialgi 중 하나이고 비밀번호가 111111일때 right

 

while(조건문){
실행문;
}

for(초기화; 종료조건; 반복실행){
    반복적으로 실행될 구문
}

break 사용
        for (int i = 0; i < 10; i++) {
            if (i == 5)
                break;
            System.out.println("Coding Everybody " + i);
        }
for문을 빠져나온다

continue 사용
        for (int i = 0; i < 10; i++) {
            if (i == 5)
                continue;
            System.out.println("Coding Everybody " + i);
        }
i=5에서 실행문이 실행되지 않고 i=6부터 계속된다 

 

 

배열의 생성
 String[] classGroup = { "최진혁", "최유빈", "한이람", "이고잉" };

String의 배열을 선언할 때 String[] 타입으로 선언
int[], char[], double[] ...

저장한 것을 꺼내오는 방법
classGroup[0] -> 최진혁
classGroup[1] -> 최유빈
...

public class LengthDemo {
 
    public static void main(String[] args) {
        String[] classGroup = new String[4];
//String 변수 4개를 저장할 배열 생성
        classGroup[0] = "최진혁";//각 변수에 저장
        System.out.println(classGroup.length);//4
        classGroup[1] = "최유빈";
        System.out.println(classGroup.length);//4
        classGroup[2] = "한이람";
        System.out.println(classGroup.length);//4
        classGroup[3] = "이고잉";
        System.out.println(classGroup.length);//4 -> 공간의 크기
 
    }
 
}

for-each문
 public static void main(String[] args) {
        String[] members = { "최진혁", "최유빈", "한이람" };
        for (String e : members) {
            System.out.println(e + "이 상담을 받았습니다");
        }
    }
members의 각 요소 값을 변수 e에 차례대로 담아와서 사용한다.

배열을 사용할 때 오류 : 인덱스를 넘어간 경우
배열의 한계 : 초기화할 때 크기가 정해짐, Collection 기능으로 유연하게 사용.

 

메소드 - 코드를 재사용할 수 있게 해준다. "재활용성"
main 메소드 : 자바가 실행하는 로직

public class MethodDemo4 {
    public static void numbering(int limit) {
        int i = 0;
        while (i < limit) {
            System.out.println(i);
            i++;
        }
    }
 
    public static void main(String[] args) {
        numbering(5);
    }
}

5를 limit에 대입받아 numbering 메소드를 실행한다.
public static void numbering() {
    int limit = 5;
    int i = 0;
    while (i < limit) {
        System.out.println(i);
        i++;
    }

즉 이와 같이 된다.

메소드를 호출할 때 전달하는 값 : 매개변수 parameter, 전달된 값 : 인자, argument

복수의 인자 - 콤마로 나열
    public static void numbering(int init, int limit) {
        int i = init;
        while (i < limit) {
            System.out.println(i);
            i++;
        }//init부터 limit-1까지 출력
    }
 
    public static void main(String[] args) {
        numbering(1, 5);
    }

메소드의 return값 받기 -> 출력이 아닌 다양하게 활용하기 위함
 public static String numbering(int init, int limit) {//문자열을 리턴함
        int i = init;
        String output = "";
        while (i < limit) {
            output += i;
            i++;
        }
        return output;
    }
    public static void main(String[] args) {
        // 메소드 numbering이 리턴한 값이 문자열 변수 result에 담긴다.
        String result = numbering(1, 5);
        // 변수 result의 값을 화면에 출력한다.
        System.out.println(result);
    }

예)
public class MethodDemo7 {
    public static String numbering(int init, int limit) {
        int i = init;
        String output = "";
        while (i < limit) {
            output += i;
            i++;
        }
        return output;
    }
 
    public static void main(String[] args) {
        String result = numbering(1, 5);
        System.out.println(result);
        try { 
            // out.txt 라는 파일에 numbering(1,5) 이라는 메소드가 반환한 값을 저장합니다.
            BufferedWriter out = new BufferedWriter(new FileWriter("out.txt"));
            out.write(result);
            out.close();
        } catch (IOException e) {
        } 
    }
메소드의 return값을 result에 담아 파일에 작성한다.

return -> 메소드를 종료시킴
public class ReturnDemo2 {
    public static String num(int i) {
        if(i==0){
            return "zero";
        } else if(i==1){
            return "one";
        } else if(i==2){
            return "two";
        }
        return "none";
    }
 
    public static void main(String[] args) {
        System.out.println(num(1));
    }
}
//중복되지 않게 모든 경우에서 한 번씩 return되어야 한다.

여러 값을 return하는 방법
 public static String[] getMembers() {
        String[] members = { "최진혁", "최유빈", "한이람" };
        return members;
    }
 
    public static void main(String[] args) {
        String[] members = getMembers();
    }

배열에 담아서 배열의 이름을 return할 수 있다. & 배열 memebers에 return받을 수 있다.

 

입력과 출력
public static void main(String[] args){
        System.out.println(args.length);
}
매개변수 String[] args 
java InputDemo 1 2 3 4 5 6; -> 6 출력
java InputDemo one two three; -> 3 출력

public static void main(String[] args){
        for(String e : args){
            System.out.println(e);
        }
}
//매개변수 args의 요소를 하나씩 출력

scanner로 입력받기

import java.util.Scanner;
public class ScannerDemo {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int i = sc.nextInt();
        System.out.println(i*1000);
        sc.close();
    }
}
//키보드로 입력 + 엔터 -> i에 값이 대입된다.

import java.util.Scanner;
public class Scanner2Demo {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while(sc.hasNextInt()) {
            System.out.println(sc.nextInt()*1000); 
        }
        sc.close();
    }
}
//hasNextInt() 는 입력값이 생길때까지 실행을 유보시킨다.
입력값이 int형이 아니면 false 리턴, int형이면 true 리턴

여러형태의 입출력
파일 입력
import java.util.Scanner;
import java.io.*;
 
public class Scanner3Demo {
 
    public static void main(String[] args) {
        try {
            File file = new File("out.txt");
            Scanner sc = new Scanner(file);
            while(sc.hasNextInt()) {
                System.out.println(sc.nextInt()*1000); 
            }
            sc.close();
        } catch(FileNotFoundException e){
            e.printStackTrace();
        }
    }
}
//out.txt를 읽어서 그 값이 int형이면 1000배 하여 출력한다

GUI만들기

이클립스에서 입력 값 사용하기 --> 초반에 한 것 (Arguments 입력)