simDev1234
심플하고 차분하게
simDev1234
전체 방문자
오늘
어제
  • 분류 전체보기
    • Computer Science
      • Basic Math
      • Data Structure
      • Algorithm
      • Database
      • OS
    • Language
      • Java
      • Kotlin
      • SQL
    • Framework
      • Spring
      • Orm&Mapper
      • 프로젝트로 스프링 이해하기
      • 스프링 라이브러리
    • Infra
      • Cloud
      • Docker
      • Redis
      • AWS, Azure
      • Device
    • Etc
      • CleanCoding
    • Git,Github

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 참조변수
  • controllerTest
  • null
  • 자바프로그램
  • JVM메모리구조
  • 자바메모리구조
  • 컨트롤러
  • 스프링
  • scanner #next() #nextLine()
  • 자바프로그래밍
  • 404
  • 참조타입
  • 자바

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
simDev1234

심플하고 차분하게

[자바_복습] 프로그램 실행구조/변수/연산자
Language/Java

[자바_복습] 프로그램 실행구조/변수/연산자

2022. 2. 2. 16:20

▼ 부스트 코스의 [쉽게 배우는 자바1], [JAVA의 정석], 국비지원과정을 들은 후 정리한 내용입니다.

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

1. 프로그램 실행구조

프로그램 실행 구조도 (원본출처는 국비 강사샘.. 위는 샘이 그린 걸 제식대로 수정한 것.)

 

2. 변수(Variable)

(1) 변수란?

: 변수란, 단 하나의 값을 저장할 수 있는 메모리 공간을 의미한다.
: 변수는 상수(constant)와 다르게 변화할 수 있는 수이다.


[※ 참조하기 : 메모리의 논리적 구조, 정수형과 실수형 데이터]









 

 

(2) 변수의 선언과 초기화

 

가. 변수를 선언 : int(변수타입)에 age(변수이름)을 적고 ;로 마침표를 찍는다.

 

나. 변수의 초기화 : 변수 선언 후 처음으로 값을 넣어주는 것

- 변수를 선언한 이후에 변수 안에 값을 넣어주어야 한다. 그렇지 않을 경우, 다른 프로그램에서 작성한 '알 수 없는 값(쓰레기 값)'과 충돌할 수 있다.
> int age = 25;

 

다. 서로 다른 두 변수의 값을 교환하는 방법 :

public class Variable
{ 
    public static void main(String [] args)
    { int x = 25; 
      int y = 30; 
      int tmp; tmp = x; 
      x = y; 
      y = tmp; 
    } 
}

 

라. 변수의 명명규칙

- 변수를 포함하여 프로그램에 사용하는 모든 이름은, '식별자(identifier)'라고 한다.
- 프로그램을 작성할 때는 항상 식별자 명명 규칙을 따라야 한다.
▶ 식별자(사용자 정의 명칭) 명명 규칙

1. 대소문자가 구분되며 길이에 제한이 없다.
- true와 True는 서로 다름
2. 예약어를 사용해서는 안된다.
- true는 예약어, True는 예약어가 아님
3. 숫자로 시작해서는 안된다.
- name1은 가능함, 1name은 불가능
4. 특수문자는 '_'와 '$'만 허용한다.

* 예약어란? 키워드 또는 리저브드 워드라고 함. 프로그래밍언어의 구문에 사용되는 단어를 의미

* 사용자 정의 명칭이란? 클래스명/메소드명/변수명/상수명 등...

* 추가적으로, 변수명 중간에 공백을 띄우면 안 됨.. (ex. myName (o), my Name(x))

 

▶ (선택사항) 그 외 자바 프로그램어들에게 권장되는 규칙

1. 클래스의 첫 글자는 항상 대문자로 한다.
- 반면, 변수와 메서드 이름의 첫글자는 항상 소문자로 한다.
2. 여러 단어로 이루어진 이름은 결합되는 단어의 첫 글자를 대문자로 한다.
- 클래스명 :
  1) Pascal 표기법 : ex. StringBuffer
  2) Pascal+snake 표기법 : ex. String_Buffer
- 메소드명/변수명 : 
  1) Camel 표기법 : ex. myMoney
  2) Snake 표기법 : ex. my_money 
3. 상수의 이름은 모두 대문자로 한다. 여러 단어로 이루어진 경우 '-'를 사용
ex. PI.MAX_NUMBER //snake표기법

* 자바에서는 모든 이름에 유니코드에 포함된 문자를 사용할 수 있으나, 가능한 클래스이름은 영문자로 하는 것이 좋다. 

* 패키지명은 대체로 소문자로 작성한다.

[※ 참고 : 기타 변수 표기법]

- 헝가리언 표기법 : 변수 앞에 접두어를 붙여 변수 성격을 표현

boolean bOk = "파리"=="새"; 
int nMoney = 100; 
char *pName = "홍길동"; //c언어 

 

(3) 변수 타입

※ 참조 : https://forsee.tistory.com/1

 

가. 데이터 타입

- 데이터 타입 :

값(data) 문자   'A', "ABC"
숫자 정수 -1, -2, 0, 1, 2
실수 1.23456, 5 X 10^2

- 변수를 선언할 때는, 저장하려는 값의 데이터 타입에 따라 변수 타입을 지정한다.


1) 기본형 변수(primitive type)

- 실제 값을 저장하며 연산이 가능하다.

크기 종류 자료형 Wrapper byte 표현 범위 연산/변환 출력서식 초기값
작다





↓





크다
논리형 boolean Boolean 1 false, true X %b or %B flase
문자형 char Charater 2 0~65535  O %c '\u0000'
정수형 byte Byte 1 -128 ~ 127  O %d
(Decimal)
%o
(Octal)
%x
(Hexa)
0
short Short 2 -32768 ~ 32767  O
int Integar 4 약 -21억 ~ 21억  O
long Long 8 20자리 O 0L
실수형 float Float 4 10^-38~10^38 *정밀도 6-7 O %f 0.0f
double Double 8 10^-308~10^308 *정밀도 9 O 0.0d 또는 0.0

* 문자는 ascii코드에 따르면 1byte나, 자바는 유니코드를 따르므로 위에서 UTF-16 유니코드 기준 2byte로 쓰인 것
* JDK가 UTF-16에 따라 문자 인코딩(문자ㅡ숫자임, 0과 1로 인코딩) , 이것을 각 운영체제에 따라 화면에 디코딩할 때는 JVM이 동작하는 시스템에 따름.
* char은, 유니코드에 의해 정수형으로 컴퓨터에 저장되기 때문에 연산/변환 가능하나, string은 배열이기에 불가
* 정밀도가 높을 수록 오차범위가 낮음. 정밀도 = 7은, 10진수로 7자리 수를 오차 범위 없이 저장할 수 있다는 뜻

[※ 참고 : Scanner의 입력메서드 - next(), nextInt(), nextDouble(), nextBoolean(), nextLine()
- java.util.Scanner : java > util > Scanner클래스 
- Scanner의 next()와 nextLine()의 차이 : https://why-dev.tistory.com/21

[※ 참고 : System.out의 출력메서드 - print(), println(), printf() 설명]
- link : https://www.geeksforgeeks.org/difference-between-print-and-println-in-java/
- print(), println(), printf()로 콘솔창에서 받은 텍스트를 출력 가능 
- 3가지 모두 여러 자료형(char,char[],boolean,int,double...)을 받을 수 있도록 오버로딩되어 있음

1. print()와 println()의 차이
1) print();   : 텍스트 출력 후 콘솔창 끝에 커서가 남음(줄바꿈x) //다음 printinf은 여기서 시작
2) println(); : 텍스트 출력 후 다음줄로 이동

2. printf()의 출력서식
1) 정수형
     %d : decimal, 10진수로 출력. 
  %20d : 전체자릿수 20개 중에서 우측정렬로 10진수 출력
 %020d : 전체자릿수 20개 중에서 우측정렬로 10진수 출력하되, 공백은 0으로 채우기
 %-20d : 전체자릿수 20개 중에서 좌측정렬로 10진수 출력

2) 실수형 
     %f : 실수형으로 출력.
   %n.f : 전체자릿수 n만큼 출력, 우측정렬
%n.mf : 전체 자릿수 n중에서 소수점은 m만큼 출력, 우측정렬 //n보다 m이 크면 n 무시

3) 문자열 
 %20.5s : 전체 20개의 문자 중에 5개만 출력
package mymain;

import java.util.Scanner;

public class PrintTest {

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		String input = scan.nextLine();
//              int num = Integer.parseInt(input); 
		double num = Double.parseDouble(input);
		scan.close();     //이걸 안하면, resource leak : scan is never closed 나타남
		
//		System.out.printf("[%d]\n",num);
//		System.out.printf("[%20d]\n",num);
//		System.out.printf("[%020d]\n",num);
//		System.out.printf("[%-20d]\n",num);
		
		System.out.printf("[%-10.3f]\n",num);
		System.out.printf("[%-3.4f]",num); //전체자릿수 무시
	}

}

>> 결과

3.56549884846546564
[3.565     ][3.5655]

>> 위에서 //부분을 활성화하고 아래는 주석처리하면 결과는

[20]
[                  20]
[00000000000000000020]
[20                  ]

 

 

package mymain;

import java.util.Scanner;

public class PrintTest {

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		String input = scan.nextLine();
		scan.close();
		
		System.out.printf("[%20.3s]\n",input);
	}

}

>> 결과

// 입력 : 가나다라마바사아자차카타파하
[                 가나다]

 

2) 참조형 변수(reference type)

- 변수의 타입으로 클래스를 가지며, NULL을 포함한 객체의 주소(4byte, 0x0~0xffffffff)를 가짐
*단, JVM이 32bit가 아니라, 64bit일 경우, 객체의 주소 곧, 참조형 변수의 크기는 8byte임
- 참조형 변수는 컴퓨터공학에서 보았던 포인터 같다. 자바에서는 이 포인터가 (일종의 설계도인) 클래스의 객체들이 있는 주소를 담는다(=가리킨다)는 점에서 약간의 차이가 있어 보인다.
- 예시

Date today = new Date();

- 컴퓨터 공학에서 C언어를 통해 포인터로 메모리를 할당했던 것과 비교

//기본형 변수 : 변수는 기본형 값을 갖음
int number = 2; 
int p = &number; //p는 number의 주소를 담고 있음. 

//참조형 변수 : 변수는 할당받은 공간을 가리키는 주소값을 갖음
int *p = malloc(sizeof(int));

//주소는 운영체제의 크기에 따라서 32bit, 64bit가 될 수 있음

 

3) 오버 플로우

- 데이터 타입에 따라 변수가 가질 수 있는 저장공간이 지정되는데, 그 이상으로 값을 넣는 경우 오버플로우 발생

 

나. 상수와 리터럴(Constant & Literal)

(1) 상수 : 값을 한 번 저장하면 변경할 수 없는 저장 공간

- 변수 타입 앞에 final를 붙여 선언
- 상수는 모두 대문자로 작성하는 것이 관례이며, 길어질 경우 _로 구분

final int MAX_SPEED = 200;

(2) 리터럴 : 실질적인 값

- 수학에서 말하는 상수
- 위 박스 안의 200도 리터럴이고, 변수 안에 넣는 숫자도 리터럴
- final int FIRST_NAME = 'c'; 이면, 여기서의 'c'도 리터럴
▶ 리터럴의 타입과 접미사

종류 리터럴 접미사
논리형 false, true 없음
정수형 123, 0b0100, 077, 0xFF, 100L L
실수형 3.14, 3.0e8, 1.4f, 0x1.0p-1 f(float), d(생략가능)
문자형 'A', '1', '\n' 없음
문자열 "ABC", "1234", "A" 없음

* 실수형의 경우, 소수점만 적어도 되며, e를 통해서 10의 제곱을 표현할 수 있다.

int small = 12345; 
long big = 85_000_000_000L; 
float less = 0.345f; 
double more = 0.3456788999; 
more = 34.56788999e-2;


▶ 타입이 불일치 해도 사용이 가능한 경우 : 타입이 달라도 저장범위가 넓은 타입에 좁은 타입을 저장하는 경우

int firstIndex = 'A'; //A는 유니코드로 65를 의미함 

double Serial = 23456; //float을 double에 넣는 경우
[※ 참고하기 : ASCII코드] 

ASCII코드(통신문자코드) : 0~126

0~31 : 통신 및 제어문자
    '\r' : carriage return(Home) = '\r\n' : 맨 앞으로 가라, 그리고 엔터해라
    '\n' : new line(Enter)
    '\t' : tab key
    '\b' : caret(커서)의 위치를 이전으로 이동
    '\a' : alert경고음
    '\f' : 다음장으로 이동해라.

32~126 : 키보드상 문자코드
    '  ' : 32
    'A' : 65
    'a' : 97 //소->대문자 간격 : 32
    '0' : 48
    '1' : 49

문자 출력시에 
System.out.printf("%c\n",65); 가능하지만,
System.out.printf("%d\n",'한'); 은 불가능.

 

다. 문자 리터럴과 문자열 리터럴

 

(1) JAVA언어에서 String은 클래스를 의미한다.

- 컴퓨터 공학에서 string은 사실상 배열이었다. 그리고 string을 C언어로 표현하기 위해서는 char *name = " "; 처럼 표현을 했다. 만약 string을 쓰고 싶다면 #include 를 통해 string을 선언한 라이브러리를 가져와야 했다.
- 마찬가지로 JAVA언어에서도 string은 문자데이터들이 모인 공간, 곧 배열을 의미한다.
- 따라서 원칙적으로 String은 아래처럼 표현해야 하는 것이 맞다.
- 다만 java에서는 기본적으로 내장되어 있는 클래스가 있어서, String name = " "; 도 허용한다.

String name = new String("JAVA");

 

(2) 문자열의 결합

- + 연산자는 왼쪽에서부터 오른쪽으로 연산을 수행한다.
- JAVA에서는 +연산자를 활용해 [문자열 + 문자열]을 할 수 있으며, 문자열이 아닌 다른 타입과 결합할 경우 순차적인 연산을 이어가며 최종적으로는 문자열로 변환한다.

public class Variable
{ 
   public static void main(String[] args) 
   { 
      String name = "홍길동"; 
      System.out.println(1+name);
      System.out.println(name+1); 
      System.out.println(1+1+name); 
      System.out.println(name+1+1); 
   } 
}

>> 결과

1홍길동 
홍길동1 
2홍길동 
홍길동11

 

(3) 특수문자를 표현하는 방법

특수문자 문자 리터럴
줄바꿈 \n
역슬래쉬(\) \\
작은따움표 \"
큰따움표 \'


라. 형변환(Casting) : 변수 또는 상수의 타입을 다른 타입으로 변환시키는 것
- 형변환 규칙

1. boolean을 제외한 나머지 7개의 기본형은 서로 형변환이 가능하다.
2. 기본형과 참조형은 서로 형변환할 수 없다.
3. 서로 다른 타입의 변수간의 연산은 형변환을 하는 것이 원칙이지만, 값의 범위가 작은 타입에서 큰 타입으로의 형변환은 생략할 수 있다.

- 아래와 같이 x의 값을 가져다가 y로 형변환을 해서 가져갈 경우, x값은 그대로 남고 y에 값을 복사해서 준다.

public class Variable
{ 
   public static void main(String[] args) 
   { 
     double x = 2.23356; 
     int y = (int)x; 
     System.out.println(x); 
     System.out.println(y); 
   } 
}

>> 결과

2.23356 
2

**정수형 int를 실수형으로 바꿀 때, float으로 바꿀 경우, int는 정밀도가 10인데 float은 8이라 오차가 발생할 수 있다. 따라서, int를 실수로 바꿀 때는 double을 쓰는 것이 좋다.

 

3. 연산자(Operator)

(1) 연산자의 종류
- 연산자 : 연산을 수행하는 기호
- 피연산자 : 연산자의 작업 대상(변수, 상수, 리터럴, 수식)

종류 연산자 설명
산술 연산자 +, -, *, /, %, <<, >> 사칙연산 및 나머지(%)
비교 연산자 >, <, >=, <=, ==, != 크기
논리 연산자 &&, \\, !, &, \, ^, ~ AND, OR
대입 연산자 = 우변의 값을 좌변에 저장


(2) 연산자의 결합 규칙(우선순위)

1. 산술 > 비교 > 논리 > 대입 순의 연산 우선순위
2. 단항 > 이항 > 삼항. **단항은 -3과 같이 피연산자가 하나인 것
3. 단항 연산자와 대입 연산자를 제외한 모든 연산의 진행방향은 왼쪽에서 오른쪽 *단항과 대입은 반대


(3) 산술 변환
- 두 피연산자의 타입이 같아야 산술 연산이 가능함 (형변환 연산자로 타입 일치 필요)
- 단, 작은 타입에서 큰 타입으로 형변환을 할 경우, 자동적으로 형변환이 이루어지므로 형변환 연산자 생략 가능
▶ 자동 산출 변환 규칙

1. 두 피연산자의 타입이 다를 경우, 보다 큰 타입으로 일치시킨다.
2. 피연사자의 타입이 int보다 작은 타입이면 int로 변환된다.
ex. short + byte = int + int = int
char + byte = int + int = int

- (주의) 연산결과의 타입이 피연산자와 다른 경우를 유의해야 한다.
ex. (int) 5 / (int) 2 = 2.5 의 경우, 둘 중에 하나를 (float)으로 형변환하여야만 함

>>산술 변환 외에 비교/논리/대입은 차후에 다시...

(4) 메서드를 사용한 연산 :
- Math.를 사용하여 사칙연산 외에 계산이 가능하다. (반올림이나 단순 비교 등)

public class Datatype
{ 
  public static void main(String[] args) 
  { //둘 중에 큰 수 출력 
    System.out.println(Math.max(9, 5)); 
    //올림 
    System.out.println(Math.floor(2.85786)); 
    //앞 수를 뒤 수로 나눈 값의 반올림 
    System.out.println(Math.floorDiv(18, 7)); 
  } 
}

 

'Language > Java' 카테고리의 다른 글

[자바의 정석_복습] 객체지향 프로그래밍1 - 클래스(변수,메서드)  (0) 2022.02.24
[자바의 정석_복습] Chapter5. 배열 -- String 문자열을 모스부호로 바꾸기  (0) 2022.02.17
[쉽게 배우는 자바1_복습] 명령프롬프트에서 자바 실행하기  (0) 2022.02.09
[자바_복습] 명령프롬프트에서 자바 실행하기, 이클립스 실행하기  (0) 2022.02.02
[자바_복습] 자바 프로그램 설치  (0) 2022.02.01
    'Language/Java' 카테고리의 다른 글
    • [자바의 정석_복습] Chapter5. 배열 -- String 문자열을 모스부호로 바꾸기
    • [쉽게 배우는 자바1_복습] 명령프롬프트에서 자바 실행하기
    • [자바_복습] 명령프롬프트에서 자바 실행하기, 이클립스 실행하기
    • [자바_복습] 자바 프로그램 설치
    simDev1234
    simDev1234
    TIL용 블로그. * 저작권 이슈가 있는 부분이 있다면 댓글 부탁드립니다.

    티스토리툴바