본문 바로가기
국비 교육/백엔드(Java, Spring)

[자바] 자바 기초 -1

by 육츠 2024. 1. 16.
Contents 접기

자바를 기반으로 한 통합 개발 환경 : 이클립스 (eclipse)

통합 개발 환경(IDE)이란 프로그래머가 소프트웨어 코드를 효율적으로 개발하도록 돕는 소프트웨어 애플리케이션.
이는 소프트웨어 편집, 빌드, 테스트, 패키징과 같은 기능을 사용하기 쉬운 하나의 애플리케이션에 통합하여 개발자 생산성을 높인다.

특징

- 대소문자 철저히 구분
- 프로그램의 기본단위는 클래스 class  이며 선언문, 명령문 등은 모두 클래스 내부에 존재해야함.
- 클래스 이름은 파일이름과 동일해야 한다.
파일 이름: First  라면 클래스 이름: public class First { } 동일하게
- 한 클래스 안에 main(String[] args) 는 하나만 가능
- 세미 콜론은 문장 끝에 필수

public class First {
   public static void main(String[] args) {  
        // 메인 메소드
        System.out.print("Hello World!");
    }
  }
- 주석
한 줄 주석 : //
문장 주석 : / * (사이에 내용 넣으면 된다.) */

 

변수

기본형 (byte 기준)

고정된 길이의 메모리 값을 표현, 더 이상 쪼갤 수 없는 기본 단위

- 정수형 : byte(1), int(4), long(8), short(2), char(2)
- 실수형 : float(4), double(8 : 64bit)
- 진위형 : boolean (숫자값 표현 불가능, 오직  true 와 false 만 사용 가능)

 

참조형(기본형 8가지를 제외한 나머지)

Srtring, System 등 존재

선언하고 초기화한 후 사용
동적 타이핑이 아님 (동적 타이핑 : 데이터가 치환되어야 타입이 결정되는 것)

 

출력

system.out.print() ; : 괄호 안의 내용을 출력하고 줄바꿈을 하지 않음 
system.out.println() ; : 괄호 안의 내용을 출력하고 줄바꿈을 함

// 문자열은 " " 만 가능하다
System.out.print("KITA DM 3기"); // 출력
System.out.println("2024년 1월 15일"); // 출력 + 줄 변경
System.out.println("월요일");

KITA DM 3기2024년 1월 15일

월요일

 

literal  : 그 자체로 값을 의미하는

상수(constract :   값을 저장할 수 있는 공간) 와 같은 의미로 단어만 다른 것이다.

		System.out.println(42.195); // 실수 literal
		System.out.println(5 * 10); // 식
		System.out.println(true); // boolean literal  / 키워드
		
		// 42.195 나 true 를 literal 이라고 부름
		System.out.println(5 > 10);
		System.out.println('강');  // 무조건 한글자만 // 문자 literal
		System.out.println('♥');
종류 리터럴 접미사
논리형 false, true 없음
정수형 123, 0b0101 등 L
실수형 3.14, 3.0e8 등 f, d
문자형 'A', '1' 등 없음
문자열 "ABC","123" 등 없음

 

문자열 string : 문자의 연속된 나열

- 선언 : byte b2;
- 초기화 : b2 = 0;
- 선언 + 초기화 : byte b3 = 0;

1) 연산에 맞는 데이터 타입에 맞게 넣어야 한다. (자바는 데이터 타입이 가장 중요)

byte b = -128;  // 음수를 넣을 수 있는 가장 작은 값
short s = -32767;
int i = 16;
long l = 45; // 45L
long l2 = 45L;

// b = b + 1; 
// b = 45 + 1 가능
// 연산에 맞는 데이터 타입에 맞게 넣어야 한다.

 

2) int는 char 안에 들어갈 수 없음

// char
char ch = 'a'; //97
ch = ch + 1; // 캐릭터 + 인트 = 인트가 됨 (큰 타입으로 맞춰짐) = 98  => 자동 형변환 (Promotion)

큰 데이터는 작은 변수안에 넣을 수 없다. 자바에서는 무조건 타입을 맞추려고 함.
* ch = (char)(ch+1); 강제 형변환 -> 하여 캐릭터 안에 넣을 수 있음 (Casting)

 

3) 큰 데이터는 작은 변수안에 넣을 수 없다.

char ch; // 변수의 선언
ch = 'a'; // 변수 초기화
		
//ch = ch +1; // char = 2byte , int = 4byte ==> 4byte + 4byte = 4byte(int)
// char 은 4 byte 보다 작기 때문에 들어갈 수 없다.
		
ch = (char)(ch +1); // int >> char 형 변환 (Caating)
System.out.println(ch);

 

_ 을 이용한 1000자리 표현

int value = 1_234_456_000;
System.out.println(value);
System.out.printf("%,d\n",value); // 다음 줄 붙어서 // 포맷형식 사용할때
System.out.println("끝!");

1234456000

1,234,456,000

끝!

 

실수형 표현

// 실수형 (float: 단정도, double: 배정도)
// 오차가 생길 수 밖에 없는 수 이기 때문에 double 을 기본으로 사용
		
float f1 = 4.1F;
double d1 = 4.1;
double d2  =0.000000123456;
		
System.out.println(d2); // 자동으로 공학용으로 바꾸어 출력됨
System.out.printf("%.15f\n",d2); // 출력하고자 하는 소수 자리를 제어

1.23456E-7

0.000000123456000

 

문자, 문자열

("%d\n",ch1) 은 문자이기 때문에 %d(정수형) 에 넣을 수 없음 >> (int)ch1 형 변환을 통해 사용

// printf 를 이용한 출력
char ch1 = 'a';
// System.out.printf("%d\n",ch1);
System.out.printf("%d\n",(int)ch1);
System.out.printf("%c\n",ch1); // 문자 1개 = c
System.out.printf("%s\n", "안녕하세요?"); // 문자열은 s

// %d, %f, %c, %s, %%, %n
// %,d, %.2f, %c, %10s

 

한글은 영어와 달리 2byte 를 사용하기 때문에 6칸을 사용함.
%10s 를 사용하면 열 칸의 자리를 단어 포함하여 가지게 된다. 

String str = "손오공";
System.out.println("====================");
System.out.println("12345678901234567890");
System.out.println(str);
System.out.printf("**%10s**\n",str); 
System.out.printf("**%-10s**\n",str); // 왼쪽정렬

====================

12345678901234567890

손오공

**       손오공**

**손오공       **

 

활용 예시

[문제] 반지름이 주어진 원의 면적을 구하는 프로그램을 작성하시오.

public class Class {
	public static void main(String[] args) {
		// = , +, -, * , /, %
		// 원의 면적 = 파이 * r^2
		int radius = 5;
		final double PI = 3.14159; // 바꿀 수 없다 (final : 초기화 되면 값을 변경 할 수 없는 지정자)
		// pi = 상수 변수 이기 때문에 upper_case 로 전부 대문자가 좋음 
		double area ;
		
		// 계산
		area = PI * (radius * radius); // 같은 연사자면 앞에 있는 연산자부터
		
		// 소수점 이하 2자리까지 출력하시오
		System.out.printf("%.2f%n",area);
		
		// 반지름이 5인 원의 면적은 78.54 이다.
		System.out.printf("반지름 %d인 원의 면적은 %.2f이다. %n",radius,area);
	}
}

 

부호 비트 ( sign bit ) = MSB

2 진수 (컴퓨터 언어) 에서는 따로 음수와 양수를 표현할 수 있는 부호가 존재하지 않는다.
때문에 부호를 알기 위해 0 (양수), 1(음수) 로 표현 하게 되었다. 하지만 char 는 음수 표현 방법이 필요없기 때문에 사용하지 않는다.

 

양수 27 과 음수 27로 비교

27 + (-27) = 0 이 나와야함 하지만 더해보면?

# 1 : 부호 존재 + 절댓값 표현방식

    0001 1011 (양수 27)
+  1001 1011 (음수 27)
--------------------------------
    1011 0110           => 0이 나오지 않게 된다.

표현은 가능하지만 연산은 되지 않는다.

# 2 부호 존재 + 1의 보수

    0001 1011 (양수 27)
+  1110  0100 (음수 27의 1의 보수)
--------------------------------
     1111 1111 
+                1
--------------------------------
     0000 0000   => 0은 나오지만 1을 후에 더한다는 번거로움이 존재

# 3 부호 존재 + 2의 보수 (1을 먼저 더한다)

저장, 연산 둘 다 가능하다.

    0001 1011 (양수 27)
+  1110  0101 (음수 27의 1의 보수 +1 = 2의 보수)
--------------------------------
    0000 0000    => 현재 가장 많이 사용하는 연산 방식이다 

 

문제

해당 문제는 같은 클래스의 한 main 안 에서 이뤄졌다.

[문제 1] 적정체중 구하기

출력문과 -, * 연산자만을 사용하여 적정체중을 구하여 출력하는 프로그램을 작성하시오
적정체중 = (키-100) * 0.9
예시: 키가 180 이라면 적정체중은 72.0

public class Exam_0115 {

	public static void main(String[] args) {
    	double height = 180;
		double weight;  
		weight = (height -100) * 0.9;
		
		System.out.printf("키가 %,.0f 이라면 적정체중은 %.1f 이다. \n", height, weight);
		System.out.println();

 

[문제 2]산술연산자를 이용한 계산식

개당 4300원인 사과가 있다. 사과의 개수는 2335 개가 있다면, 사과 도매상 13명이 한명딩 얼마를 내야하는가?

		int price = 4300;
		int total = 2335;
		double totalPrice;
		totalPrice = (price * 2335) / 13;
		
		System.out.printf("한명당 %.2f원을 지불해야함\n",totalPrice);
		System.out.println();

 

[문제 3] 자바에서 다음의 명령문을 실행했을때 결과를 유추하고 그 결과가 의미하는 것은?

# 1

해당 결과: 0.4

System.out.printf("%.2f\n", 0.1+0.3);

double d1 = 0.1;
double d2 = 0.3;
double result = d1 + d2;

# 1-1

해당 결과 : 0.30000000000000004

double d1 = 0.1;
double d2 = 0.2;
double result = d1 + d2;
System.out.println(result);

 

0.3이 아닌 이유는 2진수로 변환되면서 오차가 생길 수 밖에 없기 때문이다. (생각보다 기초적인 연산 이유이다.)
그렇기 때문에 if (result == 0.3) 이 아닌  if (result >= or <= 0.3) 이 맞는 표현이다.

실수는 같다 '=='  는 개념을 사용할 수 없다.

 

# 2

해당 결과 : Error
분모가 0인 수로 나눌 수 없기 때문에

System.out.printf("%f\n", 10 / 0 );

해당 결과 : Infinity
왜 분모가 0인데 다른 답이 나오는가?

System.out.printf("%f\n", 0.1 / 0);

 

더블과 인트를 나누면 위에서 했던 것 처럼 강제로 형맞춤이 일어난다.(더블로 강제 형변환이 됨)
때문에 연산이 더블 / 더블 (0.0) 로 이루어 지기 때문이다. ( 0.0, - 0.0 >> 0이 아닌 표현 할 수 없는 매우 작은 수) 

 

# 3

해당 결과: -128
128이면 2진수로 변환되면 앞자리(부호자리)가  1 이 되므로 음수로 착각하게 된다.
0111 1111 1111 1111 + 1 = 1000 0000 0000 0000 이므로 -128이 되는 것이다. 

byte b1 = (byte)(127+1); 
System.out.println(b1); // 왜 -128 일까?

해당 결과 : Error
int 가 byte 보다 크기 때문에 넣을 수 없음(초기화에는 넣을 수 있지만 이미 int 형이 되었으므로 byte 에 넣을 수 없는 것)

byte b2 = 1;
b2 = b2+2; 

System.out.println(b2);

 

'국비 교육 > 백엔드(Java, Spring)' 카테고리의 다른 글

[자바] 반복문 -1 (While)  (0) 2024.01.17
[자바] 연산자 Operator -2, Switch  (0) 2024.01.17
[자바] 키보드로부터 입력  (0) 2024.01.16
[자바] 자바 기초 -2  (0) 2024.01.16