Study Web Development

10월 28일

이전으로

자바

2. 자바 프로그램 작성 기초

2-3 식별자(Identifier)

2-4 변수

  1. 새 클래스 VariableMain01 생성
public class VariableMain01 {
	public static void main(String[] args) {
		// 변수(Variable)는 값을 저장할 수 있는 메모리의 공간

		// 변수 선언
		int num; // 자료형을 지정해야 함; 정수값만 저장 가능한 변수를 생성(num이라는 메모리 공간 할당)

		// 변수의 초기화
		num = 17; // 생성된 변수(num이 가리키는 빈 메모리 공간)에 17을 대입(저장)
		
		// 출력
		System.out.println(num); // num을 통해 메모리 공간에 접근해 값을 출력
		
		// 변수 선언 및 초기화
		int number = 20; // 메모리 공간을 할당하고 20을 대입
		
		// 출력
		System.out.println(number);
		
		// 동일한 변수명을 선언시 오류 발생(변수명은 unique해야 함)
		// int number = 30;
		
		// 변수에 저장한 데이터 변경
		int number2 = 100;
		System.out.println(number2);
		number2 = 90;
		System.out.println(number2);
		
		System.out.println("========");
		
		// 동일한 자료형의 변수 선언시 두 번째 변수명 앞의 자료형은 생략 가능
		// int a = 10;
		// int b = 20;
		int a = 10, b = 20;
		int result = a + b;
		System.out.printf("result = %d\n", result);
		
		// 합 연산자는 문자열이 섞여 있는 경우 덧셈이 아니라 연결을 수행함(문자의 경우 덧셈 수행)
		System.out.println("결과 = " + a + b); // 1020 출력; 문자열 다음에 숫자가 오는 경우 연결해서 새 문자열 생성
		System.out.println("결과 = " + (a + b)); // 30 출력; 숫자끼리의 덧셈 먼저 수행 후 문자열 연결
		System.out.println(a + b + " = 결과"); // 30 출력; 숫자들이 문자열 앞에 오기 때문에 덧셈 먼저 수행 후 문자열 연결
		System.out.println(a + b); // 30 출력
		
		// 변수 선언 후 초기화하지 않으면 연산이나 출력 불가(오류 발생)
		int no;
		// System.out.println(no);
	}
}

2-5 자료형

  1. 새 클래스 VariableTypeMain01 생성
public class VariableTypeMain01 {
	public static void main(String[] args) {
		System.out.println("====논리형====");
		// 논리형: 크기 1byte, 표현 범위 true, false
		boolean b = true; // 변수에는 자료형 맞는 데이터만 넣을 수 있음(문자열은 논리형에 저장 불가)
		System.out.println("b = " + b);
		
		System.out.println("====문자형====");
		// 문자형: 크기 2byte, 표현 범위 0 ~ 65,535(문자를 숫자로 변환해 저장)
		// 문자형의 크기가 1byte인 경우 영문, 숫자와 일부 특수문자만 처리 가능(ASCII)하지만 2byte인 경우 한글, 한자 등도 처리 가능(Unicode)
		char c1 = 'A';
		System.out.println("c1 : " + c1);
		char c2 = 65; // A의 아스키 코드 값을 대입; 영문의 경우 유니코드 안에 아스키 코드가 포함되어 있어 둘 다 사용 가능
		System.out.println("c2 : " + c2); // A가 출력됨
		char c3 = '\u0041'; // A의 유니코드 값(16진수, 역슬래시u로 유니코드임을 표시) 대입
		System.out.println("c3 : " + c3);
		char c4 = '자';
		System.out.println("c4 : " + c4);
		char c5 = '\uc790'; // 자의 유니코드 값 대입
		System.out.println("c5 : " + c5); // 자가 출력됨
		
		System.out.println("====정수형====");
		// byte: 크기 1byte, 표현 범위 -128 ~ 127
		// byte의 경우 표현 범위가 좁아 연산에는 잘 사용하지 않지만 입출력에 사용함
		byte b1 = 127; // 128 등 범위 초과한 값은 대입 불가
		System.out.println(" b1 : " + b1);
		// short: 크기 2byte, 표현 범위 -32,768 ~ 32,767
		short s1 = -32768; // 32768 등 범위 초과한 값은 대입 불가
		System.out.println(" s1 : " + s1);
		// int: 크기 4byte, 표현 범위 -2,147,483,648 ~ 2,147,483,647
		// int의 경우 정수의 기본 자료형으로 정수 자료형들 중 가장 많이 사용됨
		int n1 = 1000;
		System.out.println("n1 : " + n1);
		// long: 크기 8byte
		// 은행 프로그램 등 큰 단위 다뤄야 할 때 사용함, 유튜브 조회수의 경우 int로 표현하다가 21억 뷰를 초과하는 영상이 나오면서 long으로 바뀜
		long lg = 1000L; // long 변수에 1000 대입시 자바는 정수 표현의 기본형인 int로 인식 후 long으로 변환함; 숫자 뒤에 l이나 L을 붙이면 처음부터 long으로 인식함
		System.out.println("lg : " + lg);
		
		System.out.println("====실수형====");
		// float: 크기 4byte
		float f1 = 4.5f; // 소숫점 가진 값의 경우 자바가 실수 표현의 기본형인 double로 인식하여 float 변수에 더 큰 자료형의 값을 대입하지 못하고 오류가 발생함; 숫자 뒤에 f나 F를 붙이면 처음부터 float으로 인식함
		System.out.println("f1 : " + f1);
		// double: 크기 8byte, 실수의 기본 자료형으로 float보다 더 정밀함
		double d1 = 9.8;
		System.out.println("d1 = " + d1);
		
		System.out.println("====문자열 표시====");
		// 문자열은 기본 자료형이 아니지만 자주 사용하기 때문에 변수 선언하는 법을 미리 언급
		String str = "Hello World!"; // 기본 자료형은 소문자로 시작하지만, 참조 자료형은 대문자로 시작함
		System.out.println("str : " + str);
	}
}
  1. 새 클래스 PrintMain07 생성
public class PrintMain07 {
	public static void main(String[] args) {
		/*
		 * [실습]
		 * 유재석은 은행계좌를 가지고 있다. 계좌에 1,000원이 예금되어 있는데
		 * 오늘 325원을 송금받아서 잔고가 1,325원이 되었다.
		 * 특별이자율은 0.3이 적용되어 내일 이자 397.5원을 받는다.
		 * 
		 * 예금자, 송금되기 전 잔금, 송금된 금액, 송금 이후 잔금,
		 * 내일 입금될 이자를 출력하시오.
		 */
		String who = "유재석";
		int before = 1000, trans = 325;
		double plus = 397.5;
		System.out.printf("예금자 : %s\n송금되기 전 잔금 : %,d원\n송금된 금액 : %,d원\n송금 이후 잔금: %,d원\n내일 입금될 이자 : %,.1f원\n", who, before, trans, before + trans, plus);
	}
}
  1. 새 클래스 VariableMain02 생성
public class VariableMain02 {
	public static void main(String[] args) {
		/*
		 * [실습]
		 * 정수를 담을 수 있는 변수를 3개 지정한다.
		 * 변수명은 각각 a, b, c라고 지정하고 원하는 정수로 초기화한다.
		 * a + b 연산 후 출력할 때
		 * "결과 = 50" 형식으로 출력한다.
		 * c에 저장된 데이터를 80으로 변경해서
		 * "c = 80" 형식으로 출력한다.
		 */
		int a = 607, b = 801, c = 312;
		System.out.println("결과 = " + (a + b));
		c = 80;
		System.out.println("c = " + c);
	}
}
확장 특수 출력 문자(escape sequence)
  1. 새 클래스 VariableTypeMain02 생성
public class VariableTypeMain02 {
	public static void main(String[] args) {
		// '을 일반 문자처럼 출력하기 위해 앞에 \를 붙임
		char single = '\'';
		System.out.println(single);
		
		// "을 일반 문자처럼 출력하기 위해 앞에 \를 붙임
		String str = "오늘은 \"서울\"에 비가 와요";
		System.out.println(str);
		
		// 문자열 안의 '는 \를 붙이지 않아도 일반 문자로 변환되어 출력되며, \ 붙여도 동일한 결과
		String str2 = "오늘은 '목요일'입니다.";
		System.out.println(str2);
		
		// 경로 구분자 \를 일반 문자처럼 출력하기 위해 앞에 \를 붙임
		String dir = "C:\\Program Files\\Java";
		System.out.println(dir);

		String str3 = "내일은 금요일\n모레는 토요일";
		System.out.println(str3);
		
		String str4 = "이름\t나이\t취미";
		System.out.println(str4);
	}
}
형변환
  1. 새 클래스 CastMain01 생성
public class CastMain01 {
	public static void main(String[] args) {
		System.out.println("====묵시적 형변환(자동 형변환)====");
		// 작은 자료형에서 큰 자료형으로 승격이 일어나는 형태
		// 정보의 손실이 전혀 없으며 자동적으로 발생
		
		byte b1 = 127; // 8bit
		byte b2 = 127;
		// 32bit 미만 정수형 데이터를 연산하면 자동으로 32bit으로 승격됨; 결과가 자료형의 표현 범위를 벗어날 가능성이 높기 때문에 데이터를 보호하기 위해 자동 형변환하는 것
		int result1 = b1 + b2;
		System.out.println("result1 = " + result1);
		
		short s1 = 32767; // 16bit
		short s2 = 32767;
		// byte나 short끼리의 연산이라도 결과 담는 변수를 byte나 short로 선언할 경우 오히려 오류 발생
		int result2 = s1 + s2;
		System.out.println("result2 = " + result2);

		int in1 = 1000;
		long lg1 = 2000L;
		long result3 = in1 + lg1; // in1의 자료형이 int에서 long으로 자동 형변환됨
		System.out.println("result3 = " + result3);
		
		double du1 = 5.3;
		int in2 = 20;
		double result4 = du1 + in2; // in2의 자료형이 int에서 double로 자동 형변환됨
		System.out.println("result4 = " + result4);
	}
}
  1. 새 클래스 CastMain02 생성
public class CastMain02 {
	public static void main(String[] args) {
		System.out.println("====명시적 형변환(강제 형변환)====");
		// 큰 자료형에서 작은 자료형으로 강등이 일어나는 형태
		// 정보의 손실이 발생할 수 있음
		
		byte b1 = 127;
		byte b2 = 127;
		// 캐스트 연산자를 이용하여 int인 결과 값 b1 + b2를 byte로 강제 형변환함; 결과 값이 byte의 표현 범위를 벗어나기 때문에 정보의 손실이 일어남
		byte result1 = (byte)(b1 + b2);
		System.out.println("result1 = " + result1);
		
		short s1 = 1000;
		short s2 = 2000;
		// 캐스트 연산자를 이용하여 int인 결과 값 s1 + s2를 short로 강제 형변환함; 결과 값이 short의 표현 범위 안에 있기 때문에 정보의 손실이 없음
		short result2 = (short)(s1 + s2);
		System.out.println("result2 = " + result2);
		
		int in1 = 2345;
		float f1 = 25.67f;
		// 캐스트 연산자를 이용하여 float인 f1을 int로 강제 형변환 후 in1과 연산함; 소숫점 이하 자리에 대한 정보가 손실됨(버림 처리, 반올림하려면 Math.round() 함수 이용)
		int result3 = in1 + (int)(f1);
		System.out.println("result3 = " + result3);
		
		int in2 = 1234;
		long lg1 = 1234L;
		// 캐스트 연산자를 이용하여 long인 lg1을 int로 강제 형변환 후 int2와 연산함; 정보의 손실은 발생하지 않음
		int result4 = in2 + (int)(lg1);
		System.out.println("result4 = " + result4);
	}
}

3. 연산자

증감 연산자

연산자 의미 순위
++ 값을 1씩 증가 1순위
-- 값을 1씩 감소
  1. 새 자바 프로젝트 ch02-operator 생성하고 새 클래스 OperatorMain01 생성
public class OperatorMain01 {
	public static void main(String[] args) {
		System.out.println("====증감 연산자====");
		// 증가 연산자
		int i = 5;
		System.out.println(++i); // i를 1 증가시킨 후 증가된 값 6을 출력
		System.out.println(i++); // i의 현재 값 6을 출력한 후 값을 1 증가시켜 7을 메모리에 저장
		System.out.println(i); // 7을 출력

		// 감소 연산자
		int j = 10;
		System.out.println(--j); // j를 1 감소시킨 후 감소된 값 9를 출력
		System.out.println(j--); // j의 현재 값 9를 출력한 후 값을 1 감소시켜 8을 메모리에 저장
		System.out.println(j); // 8을 출력
	}
}

산술 연산자

연산자 의미 순위
+ 덧셈 2순위
- 뺄셈
* 곱셈
/ 나눗셈
% 나머지 값 구하기
  1. 새 클래스 OperatorMain02 생성
public class OperatorMain02 {
	public static void main(String[] args) {
		System.out.println("====산술 연산자====");
		
		System.out.println(1 + 1);
		System.out.println(10 - 2);
		System.out.println(10 * 3);
		// 5와 2는 정수 표현의 기본형인 int로 인식되기 때문에 연산 결과는 정수를 출력함
		System.out.println(5 / 2); // 몫을 출력
		System.out.println(5 % 2); // 나머지를 출력
		// 10f나 10.0 등 실수 자료형임을 명시하면 연산 결과도 실수를 출력함(3은 자동 형변환됨)
		System.out.println(10.0 / 3);
	}
}

다음으로