day0302
[자바의 명명규칙(Naming Convention)]
1. 공통 규칙
- 자바는 대소문자를 엄격하게 구분하는 언어로써, 만약 대소문자가 다르면 다른 존재이다.
- 자바의 모든 것들은 _를 제외한 특수문자를 이름에 사용할 수 없다.
- 이름의 중간 혹은 끝에 숫자가 나올 수 있지만 시작할 때에는 숫자가 나올 수 없다.
- 자바에서는 내부적으로 사용하는 50여 가지의 명령어가 존재한다. 우리가 그러한 명령어를 키워드라고 부르는데, 키워드로 이름을 지어줄 수 없다. 키워드는 이클립스가 자주색으로 표시를 해주기 때문에 외울 필요가 없다.
2. 낙타 등 표기법(Camel Back Notation)
- 낙타 등 표기법이란 어떤 이름이 여러 개의 단어로 이루어져 있을 경우, 단어 간의 구분을 쉽게 하기 위해서 두 번째 단어부터는 매 단어의 첫 글자를 대문자로 적어주는 표기법을 뜻한다.
3. 뱀 표기법(Snake Notation)
- 뱀 표기법이란 모든 철자를 대문자로 적어주는 경우, 각 단어의 사이에 _를 넣어서 단어의 구분을 쉽게 할 수 있게 하는 표기법이다.
4. 여러 가지 종류에 따른 명명 규칙
- 클래스의 이름은 대문자로 시작하고 낙타 등 표기법을 사용하는 명사이다.
- 패키지의 이름은 소문자로 시작하고 명사를 사용하되, 해당 패키지 안에 있는 클래스들의 성격을 주로 한 단어로 표현한다.
- 변수의 이름은 소문자로 시작하고 낙타 등 표기법을 사용하는 명사이다.
- 상수의 이름은 뱀 표기법을 사용하는 명사이다.
- 메서드의 이름은 소문자로 시작하고 낙타 등 표기법을 사용하는 동사이다.
[상수(Constant)]
- 변수와 마찬가지로 상수도 값을 저장하는 공간이지만, 차이점은 상수는 딱 한 번만 값을 저장할 수 있다.
- 상수는 다음과 같은 형태로 선언한다.
final 데이터타입 상수이름;
final int NUMBER;
NUMBER = 20;
System.out.println(NUMBER);
// NUMBER = 30; -> 이미 상수에 20이란 값을 저장했으므로 더이상 새로운 값을 저장할 수 없다.
// NUMBER = 20; -> 컴퓨터는 기존의 값이 얼마이든 간에 오른쪽 값을 새롭게 저장하려고 하므로 에러가 발생
[자료형(Data Type)]
- 자료형이란 해당 공간(변수 혹은 상수)에 어떤 종류의 값을 저장 가능한지를 지정하는 것이다.
- 자료형에는 크게 기본형 데이터 타입(Primitive Data Type)과 참조형 데이터 타입(Reference Data Type)이 존재한다.
- 기본형 데이터 타입 : 실제 값을 2진법으로 변환하여 해당 공간에 저장한다.
- 기본형 데이터 타입에는 정수형, 실수형, 문자형, 논리형 4가지 종류가 존재한다.
- 기본형 데이터 타입은 이렇게 8가지 종류만 존재한다.
정수형: byte short int long
실수형: float double
문자형: char
논리형: boolean
- 참조형 데이터 타입 : 실제 값은 별개의 공간에 저장되고, 변수 혹은 상수에는 그 공간에 접근할 수 있도록 별개 공간의 메모리 주소 값이 저장이 된다.
- 참조형 데이터 타입에는 클래스형, 배열형, 인터페이스형 3가지 종류가 존재한다.
day0303
[기본형 데이터 타입]
1. 정수형 데이터 타입
- 정수란? 소수점이 존재하지 않는 온전한 숫자
- 컴퓨터는 디지털 코드로만 값을 저장하므로 정수형 데이터 타입들인 byte, short, int, long 모두 2진법 숫자를 저장하되, 각각 저장할 수 있는 크기가 다르다.
byte : 8비트. -2^7부터 2^7 - 1까지 총 2^8 개의 숫자를 저장 가능
short : 16비트. -2^15부터 2^15 -1까지 총 2^16 개의 숫자를 저장 가능
int : 32비트. -2^31부터 2^31 -1까지 총 2^32 개의 숫자를 저장 가능
long : 64비트. -2^63부터 2^63 -1까지 총 2^64 개의 숫자를 저장 가능
- 단, 더 이상 byte 혹은 short의 사용은 하지 않으므로 -20억 ~ +20억 일 경우에는 int를, 그보다 큰 수의 경우에는 long을 사용하면 된다.
// byte 데이터타입의 변수 myByte를 선언하고 20을 넣어보자
byte myByte = 20;
// 화면에 myByte의 현재 값을 출력해보자
System.out.println(myByte);
// myByte에 만약 byte 범위를 벗어나는 값을 할당하면?
// myByte = 1000; -> 에러 발생
2. 실수형 데이터 타입
- 실수란? 소수점이 있는 숫자
float : 32비트
double : 64비트
// double 데이터타입 변수 myDouble을 선언하고 12.345 를 할당
double myDouble = 12.345;
// 화면에 myDouble의 현재 값 출력
System.out.println(myDouble);
// myDouble에 5를 할당
myDouble = 5;
// 화면에 myDouble의 현재 값 출력
System.out.println(myDouble);
// float 데이터타입의 공간에 값을 저장할 때에는
// 해당 실수가 float 타입인것을 컴퓨터에게 알려줘야하므로
// 값 뒤에 f를 붙여준다.
// float 변수 myFloat 선언
float myFloat;
// myFloat에 float 데이터타입의 값 12.3 할당
myFloat = 12.3f;
3. 문자형 데이터 타입
- char 데이터 타입의 공간에는 한 번에 한 개의 글자만 저장 가능하기 때문에 더 이상 사용되지 않는다.
- 따라서 글자를 저장하거나 표현할 때 char 데이터 타입이 아닌 String 데이터 타입을 사용한다.
- 자바 코드 상에서 따옴표는 char 데이터 타입의 값을 뜻하며 한 번에 한 개의 글자만 값에 넣을 수 있다.
- 그에 반해서 큰따옴표는 String 데이터 타입의 값을 뜻하며 한 번에 0개 이상의 글자를 저장할 수 있다.
// char 데이터타입의 변수 myCharacter 선언
char myCharacter;
// myCharacter에 'A' 할당
myCharacter = 'A';
// 화면에 myCharacter의 현재 값 출력
System.out.println(myCharacter);
// char는 기본형 데이터타입의 공간이므로
// 실제로는 해당 글자의 코드 값을 2진법으로 저장한다.
// 따라서 아래의 코드도 가능하다.
// myCharacter에 int 값 97 저장
myCharacter = 97;
// 화면에 myCharacter의 현재 값 출력
System.out.println(myCharacter);
// 화면에 character 데이터타입의 값을 가진 'AB'를 출력할려고 한다면?
// System.out.println('AB');
// -> character 데이터타입의 값은 한번에 한개의 글자만 제어할 수 있으므로 에러가 발생
4. 논리형 데이터 타입
- 논리형 데이터 타입에는 boolean이라는 데이터 타입만 존재하는데, 이 boolean은 true 혹은 false라는 두 가지 값밖에 존재하지 않는다.
- 다만 실제로는 우리가 boolean 데이터 타입의 값을 변수에 따로 저장해서 사용하는 것이 아니라 코드 상에서 즉시 결괏값을 계산해서 그 결괏값 자체를 사용할 때가 대부분이다.
// boolean 데이터타입의 변수 myBoolean 선언
boolean myBoolean;
// myBoolean에 true를 저장
myBoolean = true;
// 화면에 myBoolean의 현재 값 출력
System.out.println(myBoolean);
// myBoolean에 false를 저장
myBoolean = false;
// 화면에 myBoolean의 현재 값 출력
System.out.println(myBoolean);
[형 변환(Type Castin)]
- 형 변환이란 특정 데이터 타입의 값을 다른 데이터 타입의 값으로 변경하는 코드를 뜻한다.
- 형 변환에는 크게 암시적 형 변환과 명시적 형 변환 두 가지 종류가 존재한다.
1. 암시적 형 변환(Implicit Type Casting)
- 암시적 형 변환의 경우, 우리가 별도의 코드를 적어주지 않더라도 내부적으로 자동으로 형 변환을 하는 경우이다.
- 더 작은 데이터 타입의 값을 더 큰 데이터 타입의 공간에 저장할 때나 혹은 정수 데이터 타입의 값을 실수형 데이터 타입으로 변환할 때 발생된다.
2. 명시적 형 변환(Explicit Type Casting)
- 명시적 형 변환의 경우, 데이터 손실이 발생할 수 있기 때문에 우리가 명시적으로 형변환을 하도록 강제하는 경우이다.
- 형 변환 시에 데이터 손실이 발생하는 경우는 더 큰 데이터 타입의 값을 더 작은 데이터 타입의 값으로 변환하거나 혹은 실수형 데이터 타입의 값을 정수형 데이터 타입으로 변환할 때 발생된다.
- 명시적 형 변환은 다음과 같이 코드를 적어준다.
(바꿀 데이터타입)바꿀 값;
- 단, 데이터 손실이 발생되면 실수의 소수점 이하가 사라지거나 정수의 경우에는 overflow 혹은 underflow가 발생할 수도 있다.
- 오버플로우 : 정수가 표현 가능한 최댓값보다 큰 값이 저장되면서 값이 오히려 음의 정수로 바뀌는 경우
- 언더플로우 : 정수가 표현 가능한 최솟값보다 작은 값이 저장되면서 값이 오히려 양의 정수로 바뀌는 경우
// byte 변수 myByte 선언 후 50 저장
byte myByte = 50;
// 암시적 형변환의 경우
// 1. 더 작은 데이터타입의 값을 더 큰 데이터타입의 공간에 저장하는 경우
// int 변수 myInt 선언 후 myByte의 현재 값을 저장
int myInt = myByte;
// 화면에 myInt의 현재 값 출력
System.out.println(myInt);
// 2. 정수형 데이터타입의 값을 실수형 데이터타입으로 변환하는 경우
// double 변수 myDouble 선언 후 myByte의 현재 값을 저장
double myDouble = myByte;
// 화면에 myDouble의 현재 값 출력
System.out.println(myDouble);
// 명시적 형변환의 경우
// myInt에 20 저장
myInt = 20;
// myDouble에 23.4 저장
myDouble = 23.4;
// 1. 더 큰 데이터타입의 값을 더 작은 데이터타입의 값으로 변환하는 경우
// myInt의 값을 byte로 형 변환하여 myByte에 저장
myByte = (byte) myInt;
// myByte의 현재 값 출력
System.out.println(myByte);
// 2. 실수형 데이터타입의 값을 정수형 데이터타입의 값으로 변환하는 경우
// myDouble의 값을 byte로 형 변환하여 myByte에 저장
myByte = (byte) myDouble;
// myByte의 현재 값 출력
System.out.println(myByte);
// 오버플로우
// myByte에 128을 명시적 형변환하여 저장
myByte = (byte) 128;
// 화면에 myByte의 현재 값 출력
System.out.println(myByte);
// 언더플로우
// myByte에 -130을 명시적 형변환하여 저장
myByte = (byte) -130;
// 화면에 myByte의 현재 값 출력
System.out.println(myByte);
[연산자(Operator)]
- 연산자란 수학적 기호에 프로그래밍적 코드가 정의되어 특정 기호를 사용하면 해당 코드가 실행돼서 결괏값을 계산해주는 기호들을 연산자라고 한다.
- 연산자에는 산술 연산자, 할당 연산자, 비교 연산자, 논리 연산자, 비트 연산자 다섯 가지 종류가 존재한다.
- 산술 연산의 경우 정수와 정수끼리의 연산은 결괏값이 정수가 나오고 정수와 실수끼리의 연산은 실수가 나온다.
- 비교 연산자는 Stack 영역의 저장되어있는 값만 비교한다.
- 기본형 데이터 타입의 경우, Stack 영역에 실제 값이 저장되기 때문에 비교 연산자를 통한 비교가 정확하지만 참조형 데이터 타입은 Stack 영역에 주소 값이 저장된다.
- 실제 값을 비교하려면 해당 주소 값을 참조해서 그 주소값에 해당하는 heap 영역 안에 실제 값을 비교해야 하지만 비교 연산자는 그렇게 하는 대신, stack 영역에 저장된 주소 값을 토대로 해서 비교를 한다.
String string1 = "abc";
String string2 = new String("abc");
String string3 = string1;
System.out.println(string1.equals(string2));
System.out.println(string1.equals(string3));
System.out.println(string2.equals(string3));
- 즉, string1, string2, string3은 모두 "abc"라는 실제 값을 가지고 있지만 string2의 주소 값은 string1과 다르고 string3은 string1의 주소 값을 그대로 가져왔기 때문에 비교 연산자가 string1과 string2, string2와 string3은 서로 일치하지 않는다 라는 연산을 하게 되는 것이다.
- 따라서, 우리가 참조형 데이터 타입의 공간들의 실제 값 비교를 위해서는 비교 연산자를 사용해선 안된다.
- 대신 해당 공간의 equals()라는 메서드를 통하여 실제 값 비교를 실행해야 한다.
- equals 메서드는 다음과 같은 방법으로 사용한다.
변수이름.equals(비교대상)
[이스케이프 문자]
- 이스케이프 문자란 자바에서 다른 기능이 정의되어있는 문장부호들을 의미 그대로 사용할 수 있게 \와 조합하여 한 개의 문자로 만들어 둔 특수 문자들이다.
- 개행문자, 탭 공백, ', ", \ 등 다양한 문자들이 존재한다.
1. 개행문자
- 개행 문자는 해당 문자를 출력하면 무조건 다음 줄 첫 번째 칸으로 넘어간다.
- \n으로 적는다.
2. 탭 공백
- 탭 공백은 약 스페이스 4개 분량의 커다란 공백을 뜻한다.
- \t로 적는다.
3. 따옴표
- 만약 우리가 따옴표를 char 값의 시작 혹은 끝의 의미로 쓰는 것이 아니라 문장 기호로써 따옴표를 사용하고 싶다면 '\라고 적어주여야 한다.
System.out.println('\'');
4. 큰따옴표
- 만약 우리가 큰따옴표를 String 값의 시작 혹은 끝의 의미로 쓰는 것이 아니라 문장 기호로써 쌍따옴표를 사용하고 싶다면 \"라고 적어주어야 한다.
System.out.println("\"내 사전에 불가능은 없다!\" - 나폴레옹");
5. 역 슬래시
- 역 슬래시의 경우 우리가 문장기호로 사용되는 것이 아니라 주로 파일 경로로써 사용이 된다.
- 우리가 \를 String에 넣어서 특정 파일 경로를 화면에 출력하고 싶다면 이렇게 해야 한다.
System.out.println("C:\\내 문서\\내 프로젝트");
[printf]
1. 10진법 정수('D'ecimal)
- 10진법 정수를 그대로 출력
System.out.printf("1-A. [%d]\n", number);
- 10진법 정수를 오른쪽 정렬 4자리로 출력
System.out.printf("1-B. [%4d]\n", number);
- 10진법 정수 12345를 오른쪽 정렬 4자리로 출력
System.out.printf("1-C. [%4d]\n", 12345);
- 10진법 정수를 왼쪽 정렬 4자리로 출력
System.out.printf("1-D. [%-4d]\n", number);
- 10진법 정수를 오른쪽 정렬 4자리로 맞추고 왼쪽 빈자리가 있으면 0으로 채워서 출력
System.out.printf("1-E. [%04d]\n", number);
2. 실수('f'loat)
double d = 123.456;
- 실수를 그대로 출력
System.out.printf("2-A. [%f]\n", d);
- 실수를 오른쪽 정렬 15자리로 출력
System.out.printf("2-B. [%15f]\n", d);
- 실수를 소수점 3번째 자리까지 출력
System.out.printf("2-C. [%.3f]\n", d);
- 실수를 왼쪽 정렬 10자리, 소수점은 3번째 자리까지 출력
System.out.printf("2-D. [%-10.3f]\n", d);
- 실수를 오른쪽 정렬 10자리로 하되, 왼쪽 빈 공간이 있으면 0으로 채워 소숫점 3번째자리까지 출력
System.out.printf("2-E. [%010.3f]\n", d);
3. 스트링('S'tring)
String string1 = "aBcD";
- 스트링을 그대로 출력
System.out.printf("3-A. [%s]\n", string1);
- 스트링을 모두 대문자로 변환하여 출력
System.out.printf("3-B. [%S]\n", string1);
- 스트링을 오른쪽 정렬 6자리로 맞추어 출력
System.out.printf("3-C. [%6s]\n", string1);
- 스트링을 왼쪽 정렬 6자리로 맞추어 출력
System.out.printf("3-D. [%-6s]\n", string1);
day0304
import java.util.Scanner;
public class Ex01Scanner {
public static void main(String[] args) {
// Scanner 클래스 변수를 선언하고 초기화해보자
Scanner scanner = new Scanner(System.in);
- 위 코드에서 new Scanner(System.in)은 Scanner 클래스 변수를 초기화할 때 쓰이는 코드인데
- () 안에 System.in 은 해당 스캐너 클래스 변수가 어디서 데이터를 읽어올지 지정하는 부분이다.
- System.in 은 키보드 입력을 지칭한다.
1. 스캐너 클래스 변수를 사용해 정수 입력을 받는 방법
- 스캐너 클래스 변수의 nextInt(); 를 사용하면 정수 입력을 받을 수 있다.
int number = scanner.nextInt();
System.out.printf("사용자가 입력한 정수: [%d]\n", number);
2. 스캐너 클래스 변수를 사용해 실수 입력을 받는 방법
- 스캐너 클래스 변수의 nextDouble();를 사용하면 실수 입력을 받을 수 있다.
double d = scanner.nextDouble();
System.out.printf("사용자가 입력한 실수: [%.2f]\n", d);
3. 스캐너 클래스 변수를 사용해 스트링 입력을 받는 방법
- 스캐너 클래스 변수의 nextLine();를 사용하면 스트링 입력을 받을 수 있다.
- 단, nextInt(), nextDouble()과 같은 숫자를 입력받는 메서드 실행 후에는 반드시 nextLine()을 한 번 더 적어야 한다.
- 즉, 스캐너 버그 방지용 nextLine() 한번, 실제값을 입력받는 nextLine() 한번, 총 두 번을 적어야 한다.
scanner.nextLine();
String name = scanner.nextLine();
System.out.printf("사용자의 이름: [%s]\n", name);
[GradeBook]
- 사용자로부터 번호, 이름, 영어 점수, 수학 점수, 국어 점수를 차례대로 입력 받아서 다음과 같은 양식으로 출력되는 프로그램을 작성하시오.
결과)
번호: 0##번 이름: ###
국어: 0##번 영어: 0##점 수학: 0##점
총점: 0##점 평균: 0##.##점
import java.util.Scanner;
public class Ex02GradeBook {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int num = scanner.nextInt();
scanner.nextLine();
String name = scanner.nextLine();
int e = scanner.nextInt();
int m = scanner.nextInt();
int k = scanner.nextInt();
System.out.printf("번호: %03d번 이름: %s\n", num, name);
System.out.printf("국어: %03d점 영어: %03d점 수학: %03d점\n", k, e, m);
System.out.printf("총점: %03d점 평균: %06.2f\n", e+m+k, (float)(e+m+k)/3);
}
}
import java.util.Scanner;
public class Ex02GradeBook {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 과목의 갯수를 저장한 상수
final int SUBJECT_SIZE = 3;
int num = scanner.nextInt();
scanner.nextLine();
String name = scanner.nextLine();
int e = scanner.nextInt();
int m = scanner.nextInt();
int k = scanner.nextInt();
int sum = k + e + m;
double average = sum / (double)SUBJECT_SIZE;
System.out.printf("번호: %03d번 이름: %s\n", num, name);
System.out.printf("국어: %03d점 영어: %03d점 수학: %03d점\n", k, e, m);
System.out.printf("총점: %03d점 평균: %06.2f\n", sum, average);
}
}
'~2023.02 > 외부교육' 카테고리의 다른 글
[JAVA] 콜렉션(Collection) (0) | 2022.03.19 |
---|---|
[JAVA] 객체(Object) & 캡슐화(Encapsulation) (0) | 2022.03.19 |
[JAVA] 배열의 동적 할당(Dynamic Allocation) (0) | 2022.03.16 |
[JAVA] Call By Valeue(값에 의한 호출) & Call By Reference(참조에 의한 호출) (0) | 2022.03.15 |
[JAVA] 메서드(Method) (0) | 2022.03.12 |