일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
- 챗GPT 명령어 작성팁
- 인프런
- ChatGPT
- 객체지향
- 조건문과 반복문
- 이것이 자바다 확인문제
- Comparable과 Comparable
- 이노베이션캠프
- 자바의 정석 6장
- 자바 언어 기초
- 이노베이션캠프 동북
- 이것이 자바다 연습문제
- Til
- 스프링 입문강의
- 트리 지름 구하기
- JAVA 기초
- 이것이 자바다 13장
- 자료구조
- 웹개발 기본지식
- 이노베이션 캠프
- 백준
- 자바
- 이노캠
- 3장 확인문제
- BFS
- 채팅GPT
- 이것이 자바다
- ArrayList 개념
- Java
- dfs
- Today
- Total
기록공간
[TIL] 이노베이션캠프 in 동북 Part1 - Hello world! 본문
목차
1. 컴퓨터 언어의 역사
- 어셈블리어
- C언어의 등장
- JAVA의 등장과 특징
- JAVA의 실행과정
2. 변수
- 상수와 리터럴
- 기본형과 참조형
- 타입간의 변환 방법 예제
1. 컴퓨터 언어의 역사
우리가 알고있는, 자바,C언어,C#등 이 모든 언어들이 컴퓨터와 소통하기 위한, 언어이다.
이러한 언어를 학습하기에 앞서, 프로그래밍 언어가 어떻게 발전해 왔는지 살펴보자.
일반적으로, 인간은 48시간을 일 단위로, 180분을 시간 단위로 한번에 계산할 수 있을 것이다.
하지만 반대로 컴퓨터는 어떨까?
여기서 알아둬야할 점은, 컴퓨터는 2진법 밖에 알지 못한다. 대신 컴퓨터는 인간과 달리 매우 빠른 연산 속도를 가지고 있다.
컴퓨터의 두뇌 역할을 하는 CPU가 3.2GHz라면 1core 기준 컴퓨터는 1초 당 대략 32억 번의 연산을 수행할 수 있다.
인간은 1+3 을 바로 이해하고 계산할 수 있지만, 컴퓨터는 이러한 숫자들을 0과 1로 표현해야하는 과정이 필요하다.
컴퓨터가 이해할 수 있도록 '01010101 00000001 00001001' 이렇게 표현 되는 언어를 기계어라고 부른다.
하지만, 우리가 컴퓨터와 소통하기 위해, 기계어를 사용한다지만 사람의 입장에서는 너무 복잡하고 어렵다.
이를 해결하기
기계 명령어와 일상용어를 일대일로 매칭하도록, 니모닉의 매칭 코드표를 도입했는데, 이것이 많이 들어본 어셈블리어이다.
(니모닉 이란? : 비유법, 다른 유사한 것에 빗대어 잘 모르는 것을 설명하고자 하는 방법을 뜻함)
어셈블리어
위 표에서 "더하기를 의미하는 기계어 01010101에 매칭되는 어셈블리의 니모닉은 add라고 정하자!"는 일상용어를 어셈블리어로 변환한 명령어가 add 1,3가 된다.
이러한, 어셈블리어의 등장으로 많은 개발자들이 편해졌다지만, 개선되어야 할 점이 많았다.
애드삭 어셈블리어 개발자가 유니박 어셈블리어 프로그래머로 이직하려면, 유니박용 어셈블리어를 다시 배워야했다. 이러한 문제점을 해결하기 위해, 많은 언어가 등장했다. 그 중 대표적으로 C언어가 있다.
C언어의 등장
어셈블리어로 개발할 때는 같은 작업을 수행하는 소스 파일을 각 기계의 종류만큼 만들어야했다. 하지만, C언어의 등장으로 소스파일을 단 하나만 만들어도 되는 시대가 되었다.
C언어의 등장으로 하나의 소스코드 파일이 있다면, 모든 운영체제 컴퓨터에서 실행이 가능하다.
하지만, 각 운영체제마다 고유의 특성을 가지고 있기 때문에, C언어를 컴파일 하기전에 각 기종별로 소스코드를 수정해야할 필요가있다. ( 어떤 운영체제는 int 타입을 2바이트로 인지하고, 다른 어떤 운영체제는 int를 4바이트로 인지하는 문제점)
이러한 이유 때문인지, 아직 개선해야 할 점이 많아졌다고 한다.
JAVA의 등장과 특징
JAVA는 단 하나의 소스 파일로도 모든 기종의 컴퓨터에서 실행이 가능하다는 장점이 있다.
C언어와의 유일한 차이점은, 하나의 소스파일로 운영체제에 구애받지 않고 개발을 할 수 있다는 장점이 있다.
- Java의 목적파일은 반기계어인 바이트코드(.class)인데, 이는 운영체제가 아니라 JVM에서 사용됨. 때문에, 운영체제에 구애받지않고 단 하나의 소스 파일로도 모든 컴퓨터에서 실행이 가능하다.
- 소스코드를 바이트 코드로 컴파일 해주는 것 자바 컴파일러
Java의 실행과정
1. 개발자는 소스파일(.java)를 작성한다.
2. JDK가 제공하는 javac를 사용하여 소스파일을 컴파일한다.
3. JVM의 Class Loader는 컴파일로 생성된 바이트 코드(.class)를 전달 받아 동적 로딩을 통해 실행에 필요한 클래스들을 로딩하여, JVM 내부 Runtime Data Area에 로드한다.
4. JVM의 Execution에 의해 기계어로 해석되어 실행된다.
2. 변수
변수란 , 단 하나의 값을 저장할 수 있는 메모리 공간을 의미한다.
- 변수 공간에 기록된 값은 고정되어 있지 않고, 다른 값이 기록되면 자동으로 덮어 씌워질 수 있다.
- 메모리 공간은 정보처리의 기초 단위인 1Byte로 구성되어 있다.
- 메모리 공간은 각각이 구분될 수 있도록 '메모리 주소'를 가지고 있다.
변수 생성 규칙
- 대소문자가 구분되며 길이에 제한이 없음
- 예약어(ex->true) 사용 불가
- 숫자로 시작불가
- 특수문자 _와 $만 허용
변수의 여러가지 형태
- Camel case : varTest
- Snake case : var_test
- Pascal case : VarTest
- Kebab case : var-test (JAVA에서는 변수명에 - 기호 사용 불가)
변수의 종류
- 변수의 종류에는 클래스, 인스턴스, 지역 변수가 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
class Variable1_4 {
static int classVal = 100; // 클래스 변수
int instanceVal = 200; // 인스턴스 변수
public static void main(String[] args) {
int num; // 지역 변수
// System.out.println("int = " + num); // Error 발생
num = 300;
System.out.println("int = " + num); // 100
// 인스턴스 변수
// System.out.println("instanceVal = " + instanceVal); // Error 발생
Variable1_4 instance = new Variable1_4 (); // 인스턴스 변수 사용을 위해 객체 생성
System.out.println("instanceVal = " + instance.instanceVal); // 100
// 클래스 변수
System.out.println("classVal = " + classVal);
// 같은 크래스 내부는 바로 접근 가능
System.out.println("Main.classVal = " + Variable1_4.classVal);
// 클래스 변수 : 클래스명.클래스변수명 으로 접근 or
}
}
|
cs |
상수와 리터럴
상수 - 한 번만 값이 저장 가능한 변수
선언 방법 : final 변수타입 변수이름;
1
2
3
4
5
6
7
8
9
10
11
12
|
class Variable2_1 {
public static void main(String[] args) {
int score = 100;
System.out.println("score = " + score);
score = 90;
System.out.println("score = " + score);
final int finalScore = 100;
System.out.println("finalScore = " + finalScore);
// finalScore = 90; // Error 발생
}
}
|
cs |
리터럴 - 그 자체로 값을 의미하는 값
1
2
3
4
5
6
|
class Variable2_2 {
public static void main(String[] args) {
int score = 100;
final int finalScore = 1000;
}
}
|
cs |
- scroe : 변수
- finalScore : 상수
- 100, 1000 : 리터럴
리터럴 사용 방법 예제
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
class Variable2_3 {
public static void main(String[] args) {
// boolean flag1 = 22; // Error 발생
boolean flag2 = false; // true, false 만 가능!
// char grade1 = 'AA'; // Error 발생
// char grade2 = "A"; // Error 발생
char grade3 = 'A'; // char 타입은 이렇게 하나의 문자만 가능!
char ch = '\n'; // 개행문자(\n, \t 등) 가능!
// String name1 = 'C'; // Error 발생
// String name2 = 'Choi'; // Error 발생
String str = "C"; // 한 문자 가능! 문자가 하나여도 문자열로 인식!
String name3 = "choi"; // 여러 문자 가능!
// byte val1 = 128; // Error 발생
byte val2 = 127; // int 와 같은 리터럴로 저장하지만 범위가 지정되어 있음! -128 ~ 127
short sval = 128;
// 리터럴 접두사 예제
// int의 진수 표현
int ob = 0b0101; // 2진수, 접두사 0b
int i = 100; // 10진수
int oct = 0100; // 8진수, 접두사 0
int hex = 0x100; // 16진수, 접두사 0x
long price = 2_147_483_648L; // _ 를 사용하여 숫자 표현 가능!
// long l1 = 2_147_483_648; // Error 발생, int 범위를 넘었으니 L 접미사 필수!
long l2 = 100; // int의 범위를 넘지 않으면 L 생략 가능!
// float tax1 = 3.14;
float tax2 = 3.14f;
double score1 = 3.14159265358979; // d 생략 가능!
double score2 = 3.14159265358979d;
float f1 = 10f; // 10.0f
double d1 = 10.; // 10.0
double d2 = .10; // 0.10
double d3 = 1e3; // 1000.0 , e3 = 10의 3제곱
double d4 = -1e3; // -1000.0
}
}
|
cs |
기본형과 참조형
기본형의 표현 범위
- 1bit 에는 0과 1이 들어갈 수 있다. (1bit , 0,1 -> 2개. 8 bit = 2^8 = 256개의 숫자를 표현할 수 있다.)
- 8bit : 0 ~ 255까지 숫자 표현가능 (부호가 없을 경우)
- 8bit : -128 ~ 127 숫자 표현 가능 (부호가 있을 경우)
실수형 표현 범위
정밀도란 ? ' 소수점 몇자리 까지 오차없이 표현할 수 있는가' 를 뜻한다.
문자가 저장되는 과정
아스키코드 : 컴퓨터는 숫자 0과 1 밖에 표현하지 못하기때문에, 문자를 숫자에 매칭하는 아스키 코드표를 도입.
아스키코드
- 128개의 문자조합을 제공하는 7비트 부호
- 알파벳,숫자, 특수기호, 그 외 컴퓨터에 필요한 몇 가지만이 정의
유니코드
- 각 나라별 언어를 모두 표현하기 위해 나온 코드 체계
- 문자마다 고유한 코드 값을 제공하는 새로운 개념의 코드
- 16비트로 표현 - 최대 65,536 자 표현 가능.
UTF - 8
- 유니코드를 사용하는 인코딩 방식 중 하나
- 영문/숫자/기호는 1바이트로, 한글/한자는 3바이트로 표현
- 전세계 모든 글자들을 한꺼번에 표현가능
- 유니코드 한 문자를 나타내기 위해, 1바이트에서 4바이트까지 사용.
정수형 오버플로우
위 이미지 처럼 정수형 타입은, 해당 변수타입의 최솟값 혹은 최대값 범위를 넘어가면 값을 순환하게 된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
class Variable3_1 {
public static void main(String[] args) {
// 부호있는 경우
short sMin = -32768;
short sMax = 32767;
// short 타입에서 최솟값 범위를 넘었을 때
// sMin - 1 = 32767
System.out.println("sMin = " + sMin);
System.out.print("sMin - 1 = ");
System.out.println((short)(sMin - 1));
// short 타입에서 최댓값 범위를 넘었을 때
// sMax + 1 = -32768
System.out.println("sMax = " + sMax);
System.out.print("sMax + 1 = ");
System.out.println((short)(sMax + 1));
// 부호없는 경우
char cMin = 0;
char cMax = 65535;
// short 타입에서 최솟값 범위를 넘었을 때
// cMin - 1 = 65535
System.out.println("cMin = " + (int)cMin);
System.out.print("cMin - 1 = ");
System.out.println((int)(--cMin));
// short 타입에서 최댓값 범위를 넘었을 때
// cMax + 1 = 0
System.out.println("cMax = " + (int)cMax);
System.out.print("cMax + 1 = ");
System.out.println((int)(++cMax));
}
}
|
cs |

타입간의 변환방법 예제
문자와 숫자간의 변환
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
class Variable3_2 {
public static void main(String[] args) {
int num = 5;
char ch = '5';
// 숫자 -> 문자
System.out.println("num = " + num);
// '0' 이 48이기 때문에 결과값을 char 타입으로 변환 필요
System.out.println("num + '0' = " + (char)(num + '0'));
// 문자 -> 숫자
System.out.println("ch = " + ch);
System.out.print("ch - '0' = ");
System.out.println(ch - '0');
// '5' 에서 숫자 5로 변환되었기 때문에 결과값 6
System.out.print("ch - '0' + 1 = ");
System.out.println(ch - '0' + 1);
}
}
|
cs |

문자열로의 변환
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
class Variable3_3 {
public static void main(String[] args) {
int num = 5;
char ch = '5';
// 숫자 -> 문자열
System.out.println("num + \"\" = " + num + "");
// num 이 "5" 로 변환되었기 때문에 "5" + "5" 로 결과값은 "55"
System.out.println("num + \"\" + \"5\" = " + num + "" + "5");
// 문자 -> 문자열
System.out.println("ch + \"\" = " + ch + "");
// ch 이 '5' 에서 "5" 로 변환되었기 때문에 "5" + "8" 로 결과값은 "58"
System.out.println("ch + \"\" + \"8\" = " + ch + "" + "8");
}
}
|
cs |

문자열을 숫자,문자로 변환
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
class Main {
public static void main(String[] args) {
String str1 = "100";
String str2 = "3.14";
String str3 = "8";
// 문자열 -> 숫자
System.out.println("Integer.parseInt(str) = " + Integer.parseInt(str1));
// Integer.parseInt() 은 int 타입만 가능
// System.out.println("Integer.parseInt(str2) = " + Integer.parseInt(str2)); // Error 발생
System.out.println("Double.parseDouble(str2) = " + Double.parseDouble(str2));
// 문자열 -> 문자
System.out.println("str.charAt(0) = " + str1.charAt(0) + str1.charAt(1) + str1.charAt(2));
System.out.println("str2.charAt(0) = " + str3.charAt(0));
}
}
|
cs |
참조형
- 기본형을 제외한 나머지 타입을 의미 Ex) String, System
- 참조형 변수는 null 혹은 메모리 주소를 저장 (null은 어떤 객체의 주소도 저장되지 않음을 뜻함)
문자와 문자열
문자와 문자열의 차이 확인하기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
class Main {
public static void main(String[] args) {
char ch1 = 'A'; // 문자
// char ch2 = 'AB'; // Error 발생
// char ch3 = ''; // Error 발생, 빈 문자 불가능
String s1 = "ABC"; // 문자열
String s2 = ""; // 빈 문자열 가능
String s3 = "A"; // 문자 한 개도 문자열!
// 아래 두 표현식 모두 사용 가능하지만 ss2 방식은 거의 사용하지 않음!
String ss1 = "AB";
String ss2 = new String("AB");
System.out.println("ss1 = " + ss1);
System.out.println("ss2 = " + ss2);
}
}
|
cs |

문자열 결합
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
class Main {
public static void main(String[] args) {
String s1 = "A" + "B"; // "AB"
System.out.println("s1 = " + s1);
// 문자열은 문자열하고만 결합할 수 있기 때문에
// 숫자를 문자열로 바꾼 다음에 결합 합니다.
String s2 = "" + 7;
// "" + 7 => "" + "7" = "7"
System.out.println("s2 = " + s2);
// 문자열 결합 순서에 의한 차이 확인!
String s3 = "" + 7 + 7;
// "" + 7 + 7 => "7" + 7 => "7" + "7" = "77"
System.out.println("s3 = " + s3);
String s4 = 7 + 7 + "";
// 7 + 7 + "" => 14 + "" = "14"
System.out.println("s4 = " + s4);
}
}
|
cs |
두변수의 값 교환하기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
class Variable4_3 {
public static void main(String[] args) {
int x = 10, y = 20;
// x 와 y 값을 교환해 보겠습니다.
x = y; // x = 20;
// 변수는 하나의 값 밖에 저장할 수 없기 때문에 기존의 x의 값 10은 사라지고 20이 됩니다.
y= x; // y = 20;
// y는 20 이된 x의 값을 받습니다.
System.out.println("x = " + x); // 20
System.out.println("y = " + y); // 20
System.out.println();
// 교환이 제대로 되지 않았습니다!
int a = 10, b = 20;
int tmp; // 교환에 중간다리 역할을 해 줄 변수 하나를 선언합니다.
// a 와 b 값을 교환해 보겠습니다.
tmp = a; // a = 10, tmp = 10
a = b; // b = 20, a = 20
b = tmp; // tmp = 10, b = 10
// 결과로 a = 20, b = 10 이어야 됩니다.
System.out.println("a = " + a); // 20
System.out.println("b = " + b); // 10
System.out.println("tmp = " + tmp); // 10
// 교환이 성공적으로 되었습니다!
}
}
|
cs |

'TIL(Today I Learned)' 카테고리의 다른 글
[TIL] 프로그래머스 알고리즘 Study (0) | 2023.05.03 |
---|---|
[TIL] BOJ - 2739,10430,2439,2775,2579,1744(JAVA) (0) | 2023.05.01 |
[TIL] 이노베이션 캠프 in 동북 Part 05 . 객체지향 1 (0) | 2023.04.28 |
[TIL] 이노베이션캠프 in 동북 Part 03. 조건문과 반복문 (0) | 2023.04.26 |
[TIL] 이노베이션 캠프 in 동북 Part 02. 연산자 (0) | 2023.04.25 |