자바 - 나무보다 숲을 보자(1)
자바는 책도 그렇고 정말 방대하다
그래서 각 단원의 내용만 부랴부랴 실습하다가
여태껏 숲이 아닌 나무만 보며 공부해왔다는 걸 깨닫고
숲을 보기 위해 생활코딩 사이트의 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 (명령프롬프트)
이렇게 지정했을 때 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 입력)