본문 바로가기
Programming/Java

java basic (기본 문법)

 

 

java 17기준, python 기본 문법 공부가 충분하다는 전제로 작성된 게시물

 

 

 

 

프린트 방법 System.out,println();       <- printin 아니고 printLn 임을 유의 (소문자). ln = line 줄임말

packge, class (설계도)설정 후, void(메소드) 안에서 코드를 입력해야 실행됨

주석은 // 달고 입력한다.

package sec03.exam01;

public class hello {

	public static void main(String[] args) {
		System.out.println("Hello, Java");
// TODO Auto-generated method stub.  main method파일 필수! 맨앞은 무조건 대문자여야한다. 실행은 F 11로 함
	}
}

Hello, Java

 

 

 

 

 

변수 타입 선언과 값을 저장하고 출력하는 개념

프린트 여러개는 +로 연결

package sec03.exam01;

public class hello {

	public static void main(String[] args) {
        int value = 10;
        int sum = value + 5;
		System.out.println("sum:" + sum);
	}
	
}

sum: 15

 

 

 

 

 

변수타입 종류

 

[정수] 주로 숫자형은 int나 long씀 (요즘 ram 사양 좋아서 굳이 작은거 안씀)

byte -128 ~ 127

short 음수 -32766 ~ 32767

char 0 ~ 65535 유니코드   <- '  ' 사이에 있으면 문자도 유니코드로 인식 可.   

                                           큰따옴표 사이는 문자열(string)이므로 저장 불가

 

int  21억 위아래 범위

long  2의 62승 위아래 <- 단, long 변수명 입력시 값 뒤에 L을 써야한다! 안그러면 그냥 int로 저장됨

public class TypeExample {

	public static void main(String[] args) {
long var1 = 1000000000000000;  // 컴파일 에러 생김
long var2 = 1000000000000000L;   // L을써야 long으로 저장됨

System.out.println(Var1);
System.out.println(Var2);
}

}

 

[실수]

float 위아래 10이 38승까지   <- float로 인식시키려면 뒤에 F(f)를 붙여야함. (long과 같은 상황)

double  위아래 10의 308승까지

 

 

java는 오른쪽의 값이 왼쪽의 틀에 잘 들어가는지를 검증하기 때문에 f나 L을 입력하기를 요구한다

 

그외 과학적 표기법 2e-3 같은 것도 사용 可 (구글링 참조)

 

 

 

[문자열]

String      " " <- 쌍따옴표 사이에 넣어야 함!         (string은 기본 type에 해당되지 않음)

\ : 문자열 내부 이스케이프 문자

 

\를 통해 특정 문자를 포함시킨다.

public class StringEx {

	public static void main(String[] args) {
        String abc = " 나는 \"자바\"를 좋아합니다. ";
		System.out.println(str);
	}
}

나는 "자바"를 좋아합니다.

 

 

 

 

자동 타입 변환: 여러 type이 섞인 연산이라면 그중 가장 큰 type으로 자동 변환된다. 문자+숫자면 문자로 바뀜

byte a = 10;
int b = a;

이런식으로 byte형식의 a를 b에 복사할 때 int로 저장한다는 의미

 

 

 

 

강제 타입 변환 (작은 그릇에 큰 내용물을 담을 때):  casting(캐스팅)

int b = 10;
byte a = (byte) b;   // 이렇게 앞에 한번 더 선언해줘야 타입변환됨

 

실수에서 정수로 바꿀 때에도 (int)를 선언해줘야 한다. (소숫점은 소실된다.)

double value = 3.14;
int result = (int) value;

이 경우 result는 3만 저장된다.

 

 

 

int x = 1;
int y = 2;
double result = x / y;
System.out.println(result);

이 경우 오른쪽 x / y는 int라서 0.0이 출력됨.

 

 

 

따라서 double를 입력해줘야한다 (분자, 분모 둘다 또는 둘 중 하나만)

int x = 1;
int y = 2;
double result = (double) x / y;
System.out.println(result);

double은 여러 type이 있다면 double로 자동으로 바꾸어 연산해준다.

 

 

 

 

 

문자열로 입력된 숫자정보를 숫자형 타입으로 강제변환: 변환type.parse변환type(대상)

String str = 10;   에 대해서

Byte.parseByte(str);

Short.parseShort(str);

Integer.parseInt(str);

Long.parseLong(str);

Float.parseFloat(str);

Double.parseDouble(str);

Boolean.parseBoolean(str);

 

 

이와 반대로 문자열로 바꾸려면

String str = String.valueOf(기본타입정보);

 

 

print 함수 정리

println();         <- 내용 출력 후 행을 바꿔라 (파이썬 print와 같음)

print();            <- 내용을 출력만 해라

printf();           <- 괄호 한 첫 번째 문자열 형식대로 내용 출력해라

package sec04.exam01;

public class PrintfExample {
	public static void main(String[] args) {
		int value = 123;
		System.out.printf("상품의 가격:%d원\n", value);   //정수
		System.out.printf("상품의 가격:%6d원\n", value);  // 6자리 정수 왼쪽 빈 자리 공백
		System.out.printf("상품의 가격:%-6d원\n", value); // 6자리 정수 오른쪽 공백
		System.out.printf("상품의 가격:%06d원\n", value); // 6자리 정수 빈 자리 0으로 채움

		double area = 3.14159 * 10 * 10;
		System.out.printf("반지름이 %d인 원의 넓이:%10.2f\n", 10, area); 
// 소수점 이상 7자리 소수점 이하 2자리 왼쪽 빈 자리 공백
		String name = "홍길동";
		String job = "도적";
		System.out.printf("%6d | %-10s | %10s\n", 1, name, job);
	}
}

상품의 가격:123원
상품의 가격:   123원
상품의 가격:123   원
상품의 가격:000123원
반지름이 10인 원의 넓이:    314.16
     1 | 홍길동        |         도적

 

 

 

System.in.read()의 key code는 영어만 된다. 한글까지 되려면 sacnner가 필요

Scanner  키보드에서 입력된 모든 내용을 읽고 문자열로 출력한다.

package sec04.exam05;
// scanner는 매우 중요한 개념이다.
import java.util.Scanner; // 반드시 import해야 sacnner 작동함! 

public class ScannerExample {
	public static void main(String[] args) throws Exception {
		Scanner scanner = new Scanner(System.in);
		String inputData;

		while(true) {
			inputData = scanner.nextLine();
			System.out.println("입력된 문자열: \"" + inputData + "\"");
			if(inputData.equals("q")) {
				break;
			}
		}
		
		System.out.println("종료");
	}
}

자바
입력된 문자열: "자바"
q
입력된 문자열: "q"
종료

 

 

키보드 입력하는거 그대로 출력. q누르면 종료되는 코드이다.

 

 

자바는 일반적 수학 연산을 진행하지만 대입연산자의 경우

 

a = b = c = 5;    <- 이 경우 c에 먼저 대입 후 b에 대입, a에 대입된다. (원리만 기억하자)

 

 

부호 대입 연산시 주의점

package sec02.exam01;

public class SignOperatorExample {
	public static void main(String[] args) {
		int x = -100;
		int result1 = +x;
		int result2 = -x;
		System.out.println("result1=" + result1);
		System.out.println("result2=" + result2);
		
		byte b = 100;
		//byte result3 = -b;  //컴파일 에러 앞에 int를 붙여줘야 -를 붙인게 반영된다.
		int result3 = -b; 
		System.out.println("result3=" + result3);

	}

result1=-100

result2=100

result3=-100

 

 

 

 

 

각종 연산자 예제들

package sec02.exam02;

public class IncreaseDecreaseOperatorExample {
	public static void main(String[] args) {
		int x = 10;
		int y = 10;
		int z;
		
		System.out.println("-----------------------");
		x++;
		++x;
		System.out.println("x=" + x);		

		System.out.println("-----------------------");		
		y--;
		--y;
		System.out.println("y=" + y);		

		System.out.println("-----------------------");		
		z = x++;
		System.out.println("z=" + z);
		System.out.println("x=" + x);
		
		System.out.println("-----------------------");		
		z = ++x;
		System.out.println("z=" + z);
		System.out.println("x=" + x);
		
		System.out.println("-----------------------");				
		z = ++x + y++;
		System.out.println("z=" + z);
		System.out.println("x=" + x);
		System.out.println("y=" + y);
	}
}

-----------------------

x=12

-----------------------

y=8

-----------------------

z=12

x=13

-----------------------

z=14

x=14

-----------------------

z=23

x=15

y=9

package sec02.exam09;

public class LogicalOperatorExample {
	public static void main(String[] args) {
		int charCode = 'A';		
		
		if( (charCode>=65) & (charCode<=90) ) {
			System.out.println("대문자 이군요");
		}
		
		if( (charCode>=97) && (charCode<=122) ) {
			System.out.println("소문자 이군요");
		}
		
		if( !(charCode<48) && !(charCode>57) ) {
			System.out.println("0~9 숫자 이군요");
		}
		
		int value = 6;
		
		if( (value%2==0) | (value%3==0) ) {
			System.out.println("2 또는 3의 배수 이군요");
		}
		
		if( (value%2==0) || (value%3==0) ) {
			System.out.println("2 또는 3의 배수 이군요");
		}		
	}
}

대문자 이군요

2 또는 3의 배수 이군요

2 또는 3의 배수 이군요

package sec02.exam10;

public class AssignmentOperatorExample {
	public static void main(String[] args) {
		int result = 0;		
		result += 10;
		System.out.println("result=" + result);		
		result -= 5;
		System.out.println("result=" + result);		
		result *= 3;
		System.out.println("result=" + result);		
		result /= 5;
		System.out.println("result=" + result);		
		result %= 3;
		System.out.println("result=" + result);	
	}
}

result=10

result=5

result=15

result=3

result=0

 

 

 

 

조건문 if, if else

if문 1줄짜리는 중괄호 생략 可이지만 생략하면 가독성이 떨어지므로 알고만 있자

package sec01.exam04;

public class IfDiceExample {
	public static void main(String[] args) {
		int num = (int)(Math.random()*6) + 1;
		
		if(num==1) {
			System.out.println("1번이 나왔습니다.");
		} else if(num==2) {	
			System.out.println("2번이 나왔습니다.");
		} else if(num==3) {
			System.out.println("3번이 나왔습니다.");
		} else if(num==4) {
			System.out.println("4번이 나왔습니다.");
		} else if(num==5) {
			System.out.println("5번이 나왔습니다.");
		} else {
			System.out.println("6번이 나왔습니다.");
		}
	}
}

Math.random()은 0에서 1사이의 double 타입의 난수 하나를 출력. 그러므로 뒤에 정수를 곱하고 int로 정리한후 +1을 더하면 정수형 랜덤을 만든다. 본 예제는 주사위 번호를 하나 뽑기 위한 예제이다.

 

즉,

(int) (Math.random() * n ) + start ;

에서 start는 시작 숫자, n은 시작숫자로부터의 n개의 정수 개수 이다.

 

(int) (Math.random() * 4 ) + 8 ;

8부터 시작하여 나오는 4개의 정수 중 랜덤하게 출력된다. 8 9 10 11이 그 범위

 

 

 

 

 

 

조건문 switch

switch는 조건문의 True False로만 결정되는 범위를 확장한 개념이다.

같은 주사위 돌리기 코드는 이렇게 나온다.

package sec01.exam05;

public class SwitchExample {
	public static void main(String[] args) {
		int num = (int)(Math.random()*6) + 1;
		
		switch(num) {
			case 1:
				System.out.println("1번이 나왔습니다.");
				break;
			case 2:
				System.out.println("2번이 나왔습니다.");
				break;
			case 3:
				System.out.println("3번이 나왔습니다.");
				break;
			case 4:
				System.out.println("4번이 나왔습니다.");
				break;
			case 5:
				System.out.println("5번이 나왔습니다.");
				break;
			default:
				System.out.println("6번이 나왔습니다.");
				break;
		}
	}
}

break가 없으면 switch는 break가 나올 때 까지 실행하므로 반드시 작성해야한다!

여기선 break가 없다면 다음 case 값과 상관없이 case가 실행된다.

default는 모든 case가 아닐 경우에 대해 작성한다.

 

 

 

 

brake가 없는 switch

package sec01.exam06;

public class SwitchNoBreakCaseExample {
	public static void main(String[] args) {
		//8<= … < 12(8+4) 사이의 정수 얻기
		int time = (int)(Math.random()*4) + 8; 
		System.out.println("[현재시간: " + time + " 시]");
		
		switch(time) {
			case 8:
				System.out.println("출근합니다.");
			case 9:
				System.out.println("회의를 합니다.");
			case 10:
				System.out.println("업무를 봅니다.");
			default:
				System.out.println("외근을 나갑니다.");
		}
	}
}

[현재시간: 10 시]

업무를 봅니다.

외근을 나갑니다.

실행결과 1

 

[현재시간: 8 시]

출근합니다.

회의를 합니다.

업무를 봅니다.

외근을 나갑니다.

실행결과 2

 

[현재시간: 11 시]

외근을 나갑니다.

실행결과 3

 

 

 

 

 

switch는 그래서 string을 조건으로 적용할 수 있다.

package sec01.exam07;

public class SwitchCharExample {
	public static void main(String[] args) {
		char grade = 'B';
		
		switch(grade) {
			case 'A':
			case 'a':
				System.out.println("우수 회원입니다.");
				break;
			case 'B':
			case 'b':
				System.out.println("일반 회원입니다.");
				break;							
			default:
				System.out.println("손님입니다.");
		}
	}
}

 

 

 

반복제어문 for(초기화식; 조건식; 증감식)

package sec02.exam02;

public class ForSumFrom1To100Example1 {
	public static void main(String[] args) {
		int sum = 0; 
		
		for(int i=1; i<=100; i++) {
			sum += i;
		}
		
		System.out.println("1~100 합 : " + sum);
	}
}

int i=1 상황에서 i<=100 이라는 조건하에 i++ (1씩 계속 더하기)를 시행

 

for의 각 식은 여러개가 가능하다.  -> for(초기화식1, 초기화식2; 조건식1, 조건식2; 증감식1, 증감식2)

 

 

 

 

 

 

package sec02.exam03;

public class ForSumFrom1To100Example1 {
	public static void main(String[] args) {
		int sum = 0; 
		
		int i = 0;
		for(i=1; i<=100; i++) {
			sum += i;
		}
		
		System.out.println("1~" + (i-1) + " 합 : " + sum);
	}
}

그러나 이렇게 프린트를 적용하면 for문내 값이 바뀌면 그 값을 반영하여 적용해준다. (확장성이 더 있다.)

 

 

 

그러나 이 sum의 값(int)이 감당할 숫자가 넘어가면 음수가 출력된다.

문제가 발생할 가능성이 있다면 메모리가 낭비되더라도(요즘은 메모리 넉넉함) double을 쓰는 경향 有

 

 

또한 0.1을 더하는 연산도 제대로 작동하지 않는다. (0.1은 컴퓨터가 제대로 저장할 수 없는 숫자임)

컴퓨터는 0.1 + 0.1 = 0.2 라고 생각하지 않는다.

 

 

 

 

이중for문

package sec02.exam09;

public class  BreakOutterExample {
	public static void main(String[] args) throws Exception {
		Outter: // 겉의 for문에 이름을 붙인 형태
		for(char upper='A'; upper<='Z'; upper++) {
			for(char lower='a'; lower<='z'; lower++) {
				System.out.println(upper + "-" + lower);
				if(lower=='g') {
					break Outter;  
				}   // 겉의 for문까지 모두 종료하기 위함. 기본은 소문자만 종료
			}
		}
		System.out.println("프로그램 실행 종료");
	}
}

A-a

A-b

A-c

A-d

A-e

A-f

A-g

프로그램 실행 종료

 

 

바깥쪽은 대문자, 안쪽은 소문자만 랜덤 출력하다가 g가 나오면 중단하는 것.

for에 이름을 붙여서 모두를 중단시켰다.

 

 

 

 

 

While을 사용한 합계 코드

package sec02.exam07;

public class WhileSumForm1To100Example {
	public static void main(String[] args) {
		int sum = 0; 
		int i = 1;
		
		while(i<=100) {
			sum += i;
			i++;
		}
		
		System.out.println("1~" + (i-1) + " 합 : " + sum);
	}
}

do-while , while 비교:

 

do-while은 조건을 나중에 따지고 일단 한번은 실행. while은 조건이 미충족시 실행도 안함

do-while 사용시 'do'만 입력한다.

do{

System.out.print("월을 입력하세요==>");

month = sc.nextInt();

if( month >=1 && month <= 12 ){

break;

}

}while(true);

대충 이런식으로 사용한다. while에 특정 조건이 들어갈 수 있다.

 

 

 

 

 

 

continue를 추가한 경우의 예

package sec02.exam10;

public class  ContinueExample {
	public static void main(String[] args) throws Exception {
		for(int i=1; i<=10; i++) {
			if(i%2 != 0) {
				continue;
			}
			System.out.println(i);
		}
	}
}

2

4

6

8

10

 

728x90
반응형