본문 바로가기
클라우드 활용 자바개발자 양성과정/01. JAVA 프로그래밍 언어 활용

변수(Variable)

by moca7 2024. 6. 18.


ㅁ 메서드는 호출을 해야 중활호 블록이 실행됨.
- 메인 메서드는 호출을 안해도 자바 어플리케이션 실행 시 최초로 실행됨. 그래서 실행 메서드라고 함. 
- 프로젝트에 main 메서드가 적어도 하나는 있어야 됨. 
여러개의 메인 메서드가 있으면 run할 때 선택하라고 뜬다.

ㅁ 메서드가 곧 하나의 기능이다. 덧셈, 뺄셈 등을 메서드로 각각 작성. 

ㅁ 출력문
- 특정 값을 화면(콘솔창)에 출력하고자 할 때 작성하는 명령문.


1. println(출력값);          
- 값 출력 후 줄바꿈까지 함. 출력값은 생략 가능 그냥 엔터만 치는 효과.


2. print(출력값); 
- 값 출력만.


3. printf("출력하고자 하는 형식(포맷)", [출력값, ...]);          //        출력값은 생략가능
- 형식(포맷) 기반으로 값들을 출력. 줄바꿈 x.
- System.out.printf("안녕하세요. %d월 %d일 %s에 오신걸 환영합니다.\n", 6, 18, "구디아카데미");
\n을 안녕하세요. 다음에 넣어도 됨. 

= 출력하고자하는 형식을 앞에 문자열로.

 

-

int num1 = 10;

int num2 = 20;

System.out.println(num1 + " " + num2);

System.out.printf("%d %d", num1, num2) ;        //    둘의 결과가 같다. 

 

-

System.out.println(num1 + " " + num2 + "%");             //   10 20%

System.out.printf("%d %d%", num1, num2) ;              //    에러 발생.

 

문자열에서 %를 쓸 때는 주의가 필요하다. 

키워드로서 %를 쓰는게 아니라 텍스트로서 쓰고싶으면 %%를 쓰면 된다.

 

- printf문에서는 \n 대신 %n을 써도 똑같이 개행된다. 

%%: %문자 출력

%n: 개행문자(줄바꿈) <- printf에서만 사용 가능. 

 

- System.out.printf("%d\n", num1, num2);

출력할 값은 2개인데 공간은 1개인 경우. 

에러나지 않고 그냥 첫번째 값만 출력됨. 두번째 값은 무시됨. 

- System.out.printf("%d %d\n", num1);

10은 출력되고 그 다음 에러 발생.

두번째 포맷에 들어갈 값이 없어서. 

- 포맷 값보다 많은 값을 제시하는건 괜찮지만 포맷 값보다 부족한 값을 제시하는건 오류 발생.

 

ㅁ 

double dNum1 = 1.23456789;

double dNum2 = 4.53;

 

System.out.printf("%f %f\n", dNum1, dNum2);      //     1.234568 4.530000

 

- 기본적으로 %f는 무조건 소수점 이하 6자리까지 출력됨.

 

System.out.printf("%.2f %.1f\n", dNum1, dNum2);   //    1.23 4.5

 

char ch = 'a';

String str = "Hello";

System.out.printf("%c %10s %s \n", ch, str, str);    //    a      Hello Hello

System.out.printf("%C %S \n", ch, str);          //        A HELLO 

 

- %c와 %s는 대문자로 기술된 경우, 대문자로 변환시켜서 출력하는 특징이 있다. 

 



- 한글자는 홑따옴표 'A'
- 문자열은 쌍따옴표 "가나다"
(참고로 쌍다옴표 안에 한글자만 쓰는것은 가능)

ㅁ public class FirstClass { // 진짜 클래스명(풀클래스명)은 com.br.first.FirstClass다.
~~
}


ㅁ 메서드 작성 형식
- 접근제한자 반환형 메서드명() { 소스코드 }

ㅁ 다른 클래스에 정의되어 있는 메서드 호출 방법
1. 해당 클래스를 생성(new)하기
[표현법] 클래스명 사용할이름 = new 클래스명();
2. 생성된 해당 클래스를 통해 메서드 호출
[표현법] 사용할이름.메서드명();

=> 그런데 에러가 남. 

ㅁ 다른 패키지에 있는 클래스를 실행하는 방법
1. 풀클래스명 제시
com.br.first.SecondClass sec = new com.br.first.SecondClass();
sec.methodA();


2. import문으로 한번만 선언해두는 방법(사용할 때마다 풀클래스명 안 써도 됨)
패키지 선언 아래에
import com.br.first.*; 혹은   import com.br.first.SecondClass;

SecondClass sec = new SecondClass();
sec.methodA();


ㅁ 같은 클래스 내에 존재하는 메서드 호출은 그냥 가능.
ㅁ 같은 패키지이고 다른 클래스에 존재하는 메서드 호출은 그냥 객체 생성하고 이름.메서드명()으로. 

ㅁ 
- 패키지명: 소문자로 시작
- 클래스명: 대문자로 시작         //   com.br.first.SecondClass
- 메서드명: 소문자로 시작        //   com.br.first.SecondClass.methodA();
- 변수명: 소문자로 시작

<식별자의 이름 규칙(표기법) >
1. Pascal Case : 각 단어의 첫 글자는 대문자, 나머지는 소문자 (클래스명)
2. Camel Case : Pascal Case와 동일하나 첫 글자는 소문자로 (메서드명, 변수명)
3. Snake Case : 각 단어의 연결을 밑줄(_)로 함 ex) java_value (상수명, 폴더명)


ㅁ 값을 데이터라고도 하고 리터럴이라고도 한다. 

ㅁ 값(리터럴): 프로그램상에 필요한 명시적인 data: 사용자가 마우스 또는 키보드로 입력한 data 

ㅁ 변수: 값을 메모리에 저장하기 위한 공간. 한개의 값만 담을 수 있다. 새로운 값을 대입할 수도 있다(변경). 

ㅁ 상수: 변수 선언 구문 앞에 final 붙여서 선언. 변수와 비슷하나 한번 담긴 값을 변경할 수 없다. 


ㅁ 쌍따옴표 안에
- 홑따옴표는 그냥 넣을 수 있음.
- 쌍따옴표는 쌍다옴표 앞에 백슬래쉬. ("\"안녕\"하세요")
(""안녕"하세요") <- 쌍따옴표가 바로 끝난 판정.

ㅁ 문자와 숫자간의 연산 결과
('a' + 1);
- 각 문자들 마다 컴퓨터가 인식하는 고유 숫자값 존재

ㅁ 문자열과 그 외 값 간의 연산 결과 (덧셈만 가능)
("안녕" + true) 안녕true
("안녕" + 1+ 2+ '!') 안녕12!
(1 + 2+ "잘가" + 3 +4) 3잘가34     <- 3과 4를 더하고 싶으면 (3+4)
- 자바에서는 문자열과 다른 데이터 유형 간의 연산에서 자동으로 형변환을 수행합니다. 
즉, 숫자나 다른 데이터 유형이 문자열로 변환되어 문자열과 함께 출력됩니다. 




ㅁ 메모리
- 램 RAM
- 자바 프로그램이 동작할 때 사용되는 필요한 값들이 저장되는 장소
- 메모리는 휘발성이이기 때문에 프로그램 종료시 메모리상에 존재한 것들은 다 사라짐
- 영구적으로 프로그램 종료시에도 저장하고 싶다면 db에.
- 특정값을 메모리상에 보관(기록)하고자 할 경우 변수라는걸 먼저 메모리상에 만들어야 함.

ㅁ 자바에서 곱셈 연산 기호는 특수문자 별 *


ㅁ 변수 사용 이유
1. 값에 의미를 부여할 수 있음 (소스코드 가독성이 좋아짐)
2. 자주 사용하는 값을 변수에 담아두면 동일한 값을 계속 사용할 수 있다.

3. 유지보수에 용이함. (일일이 모든 코드를 변경하지 않고 변수 한번만 변경.)

 

 

ㅁ < 기본 자료형 primitive type >

- 8개

(1) 정수형 : byte(1byte), short(2byte), int(4byte), long(8byte)
(2) 논리형 : boolean(1byte)
(3) 문자형 : char(2byte)
(4) 실수형 : float(4byte), double(8byte)


ㅁ < 참조 자료형 reference type >
- 기본 자료형을 제외한 모든 자료형들이 참조 자료형이다.
- 기본 자료형은 다 소문자로 시작, 참조 자료형은 다 대문자로 시작.

 

(1) 문자열 : String

 

 

 

- boolean bool1;                  //   변수 선언

- bool1 = true;                      //   변수에 값 대입

- boolean bool2 = false;       //   변수 선언과 동시에 초기화

 

 

 

--

 

int가 정수형 중에 대표자료형(기본형)(long은 메모리 낭비가 커서. int만으로도 많은 수를 담을 수 있음.)

double이 실수형 중에 대표자료형(더 정확한 값을 담을 수 있기 때문에)

- double이라고 double보다 큰 범위의 수는 담을수 있는 것은 아님. 

 

char a = '홯';

- System.out.println(a);               //      홯

- System.out.println((int)a);           //      54895

 

ㅁ 자바에서 변수명에 한글을 사용할 수는 있으나 권장되지 않음. 영어가 기본. 

 

ㅁ < 사용자로부터 키보드로 값 입력받기 >

- 자바에서 제공하는 Scanner 클래스의 메소드를 이용해서 값을 입력받을 수 있다.

 

(1) Scanner 클래스 생성(2) Scanner 클래스 내의 nextXXX() 메서드 실행- next(): 사용자가 입력한 값 중에 공백 이전까지의 값 읽어들이기 ('이 초홍'입력하면 '이'만 담김)- nextLine() : 사용자가 입력한 값 중에 엔터 이전까지의 값 전체 읽어들이기- nextInt() : 사용자가 입력한 값 중에 정수값을 읽어들이기- nextDouble() : 사용자가 입력한 값 중에 실수값을 읽어들이기(3) 읽어들인 값을 보관해두고자 한다면 변수에 대입해두기

 

- System.in의 의미는 입력받은 값을 바이트 단위로 읽어들이겠다라는걸 의미.

그래서 스캐너 클래스를 만들 때는 반드시 괄호 안에 System.in을 명시해줘야함.

 

 

ㅁ 

- Scanner sc = new Scanner(System.in);

sc.next();가 있으면 사용자의 응답을 기다리기 위해(빨간 네모로 확인) 코드가 계속 거기에 머물러 있다.

그 다음으로 진행 안된 상태이다.

- Scanner도 참조자료형. sc는 참조변수.

 

next()와 nextLine()은 숫자를 입력받아도 문자열로 인식하기 때문에 변수에 담을 때 String 타입에 넣어야만 한다.

 

ㅁ 변수

- 기본자료형 8개

- 참조 자료형 : 기본 자료형을 제외한 모든 자료형들.

 

ㅁ 예제

Scanner sc = new Scanner(System.in);

 

System.out.print("이름: ");

String name = sc.nextLine();

 

System.out.print("나이: ");

int age = sc.nextInt();

// sc.nextLine();                 추가

 

System.out.print("주소: ");

String address = sc.nextLine();

 

System.out.print("키: ");

double height = sc.nextDouble();

// sc.nextLine();                 추가(다음에 nextLine()이 또 입력 받을 예정이라면)

System.out.println(name + "님은 " + age + "살이며, 사는 곳은 " + address + "이고, 키는 " + height + "cm입니다.");

 

 

[출력 결과]

이름: 이이이

나이: 23

주소: 키: 155

이이이님은 23살이며, 사는 곳은이고, 키는3.0cm입니다.

 

- address에 지금 공백이 담겨있다.

앞의 나이 입력할 때 nextInt에서 값만 가져가고 공백은 버퍼에 남아 있어서,

변수 address가 생기자마자 버퍼의 공백이 바로 들어간 거.(버퍼의 엔터를 사용자가 입력했다고 인식해서)

버퍼에 남아있는 엔터를 비워주면 해결.

 

- nextLine()메서드와 그 외의 next관련 메서드는 크게 2가지 차이점이 있다. 

1) 사용자가 키보드로 값을 입력(엔터)하면

2) 버퍼에 값이 들어옴. (그 값은 사실 버퍼에 들어가 있음) 

3) sc.nextXXX() 메서드가 동작되서 버퍼에 들어온 값을 읽는다(변수에 기록).

 

sc.nextLine() : 버퍼에서 엔터 이전까지의 모든 값을 읽어들인 후 엔터를 비워주기까지 함.

그 외 메서드 : 버퍼에서 엔터 이전까지의 값을 읽어들인 후 엔터를 비워주지 않음. 

 

 

- 문제는 sc.nextInt()나 sc.nextDouble() 등의 숫자 입력 후에 sc.nextLine()을 사용하면 개행 문자(Enter 키)가 버퍼에 남아 있어서 추가적인 입력 처리가 이상하게 동작할 수 있습니다.

 

- sc.nextXXX() 후 sc.nextLine()이 오게될 경우,

버퍼에 남아있는 엔터때문에 사용자가 값을 입력했다고 인지해서 곧바로 값을 읽어들인다.

(sc.nextLine()이 바로 실행되어버림)

 

해결 방법: sc.nextXXX() 후에 sc.nextLine()이 와야될 경우,

sc.nextLine()이 수행되기 전에 버퍼에 남아있는 엔터를 비워주는 과정을 추가하면 된다. 

(강제로 sc.nextLine() 한번 더 수행시켜 주기)

 

 

ㅁ nextChar는 없다.

System.out.print("성별(M/F) : ");

char gender = sc.nextChar();          //        에러

 

- Scanner 클래스에 nextChar() 메서드가 존재하지 않는다.

그래서 어쩔수없이 문자열을 먼저 읽어들이고, 그 다음 문자열을 (x번 인덱스) 추출하기

 

- 그냥 sc.nextLine()으로 문자열을 받아서 0번 인덱스 자리의 문자 하나만 추출하기. 

(Male을 입력하든 M을 입력하든 0번인덱스가 M이다.

그리고 그 뒤에 charAt() <- 문자열에서 x번 인덱스를 추출하는 메서드.

 

-

System.out.print("성별(M/F) : ");

char gender = sc.nextLine().charAt(0);

                      [문자열데이터].charAt(n);

 

ㅁ  문자열.charAt(추출하고자 하는 인덱스 번호를 반드시 써야함); 

- 문자열로부터 해당 인덱스의 문자값을 뽑아서 돌려줌.

 

System.out.println("apple".charAt(3));           //          l이 출력됨.

String fruit = "kiwi";

System.out.println(fruit.charAt(3));            //          i가 출력됨.

 

Scanner sc = new Scanner(System.in);

System.out.print("과일: ");

System.out.println(sc.nextLine().charAt(3));

 

 

ㅁ 자동 형변환

- 대입연산자 기준으로 왼쪽과 오른쪽은 자료형이 같아야 함.

- 자료형이 다른 두 값의 연산(대입, 계산 등)시 자동으로 값의 범위가 작은 자료형이 큰 범위의 자료형으로 변환되서 처리됨. 

int i = 12;

double d = i;           //         int형이 double형으로 자동 형변환 됨.

 

double discountRate = 10.0;

 

System.out.println("할인율 : " + discountRate + "%");           //    할인율 : 10.0%

System.out.println("할인율 : " + discountRate * 100 + "%");           //     

System.out.println("할인율 : " + (int)discountRate * 100 + "%");     //

 

ㅁ byte, short, int, long은 전부 float으로, 혹은 double로 자동 형변환 가능함.

 

ㅁ char과 int는 자동 형변환된다. (각각의 문자마다 고유한 숫자가 있기 때문에 가능.)

- int num = 'a';             // 가능        int num = /* (int) */ 'a'; 

char ch = 65;              // 가능        char ch = /* (char) */ 65;

 

- char 형에 음수는 넣을 수 없다. 문자에 0부터 시작하는 숫자가 지정되어있어서. 

 

 

double d = 4.0l

float f1 = (float) d;      //       명시적 형변환 해줘야 함. 

float f2 = 4.0f;           //        사실 이 f도 형변환 연산자.

 

ㅁsyso하고 ctrl + 스페이스하면 단축키. 

 

ㅁ 예제

/*

* 키보드로 문자 하나를 입력 받아 그 문자와 그 문자의 고유숫자 값을 출력하시오.

*

* ex)

*

* 문자 : A (=> 사용자가 입력한 값)

*

* A 숫자값 : 65 (결과 출력)

*/

 

Scanner sc = new Scanner(System.in);

 

System.out.print("문자 하나를 입력해 주십시오.");

char ch = sc.nextLine().charAt(0);

System.out.println(ch + " 숫자값 : " + (int)ch);

 

ㅁ 예제

- 주석과 같은 값이 나오도록 출력문 안을 수정하라.

int iNum1 = 10;

float fNum = 3.0f;

System.out.println( iNum1  fNum );    // 3.3333333

System.out.println( iNum1  fNum );    // 3.333333333333335

 

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

System.out.println( iNum1 / fNum );                    // 3.3333333

System.out.println( (double)iNum1 / fNum );     // 3.333333333333335

 

- pirntf로 %.7f를 하지 않더라도, float은 소수점 아래 7자리를 출력한다. double은 소수점 아래 15자리를 출력한다. 

 

- 3.333333333333335에서 마지막에 5가 나오는 것은 Java의 부동 소수점 연산의 정밀도 한계로 인한 결과입니다.

 

 

ㅁ 복합 대입 연산자

- 산술연산자와 대입연산자가 결합되어있는 형태

- 연산처리 속도가 빨라지기 때문에 사용하는것을 권장

 

+=   -=   *=   /=

 

 

'클라우드 활용 자바개발자 양성과정 > 01. JAVA 프로그래밍 언어 활용' 카테고리의 다른 글

06. 객체  (0) 2024.06.27
05. 배열  (0) 2024.06.24
03. 연산자 & 04. 조건문  (0) 2024.06.20
이클립스 설치&사용법  (1) 2024.06.18
Java 설치&설정  (0) 2024.06.18