JAVA_1

Week 1.

-컴퓨터(하드웨어, 기계) vs 소프트웨어/프로그램
-프로그래밍 언어 > 기계어, 어셈블리어, 고급언어

>기계어 : 0, 1의 이진수로 구성, 컴퓨터의 cpu는 기계어만 이해하고 처리 가능
>어셈블리어 : 기계어 명령을 사람이 이해할 수 있는 문자로 표현, 쉬운 상징적인 단어인 니모닉 기호(mnemonic symbol)로 기계어 명령을 일대일 대응시킨 언어
>고급언어 : 사람이 이해하기 쉬움, 절차 지향 언어(C)와 객체 지향 언어(C++, Java)

-컴파일 : 소스파일을 컴퓨터가 이해할 수 있는 기계어로 만드는 과정

>확장자: xx.java -> xx.class

-자바: 플랫폼 종속성(platform dependency)
: 플랫폼 = 하드웨어 플랫폼 + 운영체제 플랫폼
-WORA(Write Once Run Anywhere) : 코드 재사용, 기존 언어가 가진 플랫폼(cpu/운영체제) 종속성 극복
-WORA를 가능하게 하는 자바의 특징 : 바이트 코드(byte code) - 자바 소스를 컴파일한 목적 코드
(자바 소스코드를 컴파일하면 바이트 코드로 된 클래스 파일이 생성된다)
cpu에 종속적이지 않은 중립적 코드, JVM(Java Virtual Machine, 자바 가상 기계)에 의해 해석(번역)되고 실행됨 (Interpreter)

-JAVA SE(Java Platform Standard Edition): 자바 표준 배포판, 데스크탑과 서버 응용 개발 플랫폼
-JDK(Java Development Kit): 자바 소프트웨어를 개발하는 데 필요한 여러가지 도구를 모아서 제공하는 것.
-> JVM(Java Virtual Machine): 자바를 실행할 수 있는 환경.
-> JRE(Java Runtime Environment): 컴파일된 자바 API(Application Programming Interface, 클래스 라이브러리)들이 들어있는 모듈 파일, 자바로 만들어진 프로그램을 구동하는 데 필요한 실행환경을 제공.
-자바는 필요한 클래스들을 프로그램 실행 중에 동적으로 로딩.

<자바와 C/C++비교>
자바 > 컴파일러가 바로 바이트 코드 생성, 링크 과정 X
바이트 코드는 자바 가상 기계에서만 실행 가능
자바는 실행시간에, 필요한 클래스들이 자바 가상 기계에 의해 링크되며 클래스 로더가 필요한 클래스를 동적으로 로딩한다.
ClassLoader 객체를 이용하여 개발자가 직접 클래스를 로딩할 수도 있다.
C/C++ > C/C++에서는 컴파일러가 중간 단계인 목적 코드를 ㅅ애성한 후 링커가 필요한 라이브러리들을 링크하여 최종 실행 가능한 .exe파일을 만든다.
정적 라이브러리의 경우 실행 파일에 포함시키므로 실행 파일 크기가 커진다.
동적 라이브러리의 경우 실행 시간에 링크가 일어난다.
목적 코드 및 실행 파일은 플랫폼에 따라 다르므로, 플랫폼이 바뀌면 소스 코드를 수정하거나, 컴파일과 링크를 새로 해야 한다.

Week 2.

-public -> 접근 지정자(access specifier)_다른 모든 클래스에서 해당 클래스를 자유롭게 사용할 수 있다는 선언
-class 키워드로 클래스 선언

class > 설계도!
메소드 > C에서의 함수..

-public static void로 main() 메소드 선언

> 한 클래스에 2개 이상의 main() 작성하면 Xx
> 실행하는 클래스엔 반드시 main 필요.
.java -> main() 하나
실행하는 소스들에 main() 여러 개 있을 수 있음
지정한 main()부터 실행 O, 나머지 지정 안한 main들은 전부 무시된다
//main 함수는 이렇게!
public static void main(string[]args){
...
} //static은 약간 문 역할.. 없으면 객체를 지정해줘야 함!

-클래스 바깥에서는 메소드를 작성할 수 Xx
-변수(속성)

>클래스 내 -> 클래스 변수, 속성 vs 메소드 내
>메소드 내에서 선언된 변수 : 지역변수 (메소드 밖에서도 선언되는 변수가 존재한다는 것을 알 수 있음!)_메소드 내에서만 사용되며, 메소드의 실행이 끝나면 소멸

-출력 :

System.out.println("hello world");  //hello world

System.out.println() : 출력 후 다음 행으로 이동
System.out.print() : 출력 후 다음 행으로 넘어가지 않음

-식별자

>특수문자, 공백, 탭 Xx
>'_', '$' 사용 O
>**대소문자 구별!**
>키워드 X(예약어)
>되도록이면.. 한글 쓰지 마세요

클래스 이름: 대문자 시작
상수 이름: 모든 문자 대문자 표시
변수&메소드 이름: 소문자 시작

-final로 선언하면 상수가 됨(define과 비슷)

final static double PI = 3.141592;
//상수이므로 나중에 값 변경 불가

-데이터 타입:

>논리: boolean (1비트, true 또는 false)
 +C와 달리 true=1로 치환 불가
>문자: char (2바이트, UNICODE)
>정수: byte (1-
	 short (2-
     int (4-
     long (8-
>실수: float (4-
     double (8-

-레퍼런스 > 배열Array, 클래스class, 인터페이스interface(클래스의 일부,,) 에 대한 레퍼런스로 용도가 나뉨 (C언어 포인터와 비슷)

>C언어 포인터 : 주소값 기본..
>레퍼런스 : 더 많은 정보를 갖고 있음

-문자열: 기본 type Xx,, 객체!

>문자열은 전부 class -> 공통적으로 구현된 기능 존재(메소드들,,)
>리터럴(변수에 넣는 변하지 않는 데이터, 프로그램에 직접 표현한 값) : String toolName = "JDK"
>문자열이 섞인 +연산 -> 문자열로 간주
(기본타입의 값을 문자열로 자동변경(자동 형변환), 문자열 연결 -> 새 문자열 생성)

-정수 리터럴 -> int 형으로 자동 컴파일
-long 리터럴 -> 숫자 뒤에 L을 붙여 표시
ex) long g = 24L; //24L은 24l과 동일

10진수 : 15 -> 10진수 15
8진수 : 015 -> 십진수 13(18+5 = 13)
16진수 : 0x15 -> 십진수 21(1
16+5 = 21)
2진수 : 0b0101 -> 십진수 5

-실수 리터럴 -> double 타입으로 자동 컴파일
(숫자 뒤에 f, d 명시적으로 붙이기도 함, F나 f를 붙이면 float로/ D나 d를 붙이면 double 타입으로 강제 변환 가능)
-\u 다음에 4자리 16진수 (2바이트의 유니코드)
-특수문자 리터럴 -> \로 시작!

-boolean a = true;(C/C++과 달리 숫자를 참, 거짓으로 사용 불가)
-null -> 객체 레퍼런스에 대입해야 함! 기본타입에는 사용 불가
ex) String hi = null;

-숫자와 숫자 사이에 '_' 사용 가능(가독성을 위함)
ex) 1. int a = 2__5;
2. int a = 25; //동일한 의미!
-var (->지역변수에만 사용) : 변수 타입 선언 생략, 컴파일러가 변수타입 추론
ex) var price = 200; //price는 int 타입으로 결정된다.
변수 선언문에 반드시 초기값 지정(초기화 필수)
ex) var name; //컴파일 오류, 타입 추론 불가..

>공부할 때는,,, 명시적으로 쓰는 걸 추천,,,,

-final : 변수를 상수로 만들어줌 -> 초기화 이후 값 변경 Xx
반드시 초기화! (초기화 안하면 사용 불가)

>상수이름 all 대문자
ex) final double PI = 3.14159;

-자동 타입 변환 >> 제발 사용 Xx, 나중에 오류 많아질 우려 존재
ex1) long m =25;
//int타입인 25가 long타입으로 자동 변환되는 사례,, 25(32bit) > 0025(64bit)
ex2) double d = 3.14*10;
//실수 연산을 하기 위해 10이 10.0으로 자동 형변환

>>필요하면 명시적으로!!
주의) 데이터 손실&오류 있을 수도,,

0x41 -> 'A'

ex) ```
byte b = 127;
int i = 100;
system.out.println((byte)b + i); //227

//binary는 1110 0011,,,



-System.in : 표준 입력(키보드) 스트림 객체, 키를 읽음
 > 키 값을 바이트(문자X)로 리턴 -> 입력값 사용을 위해서는 응용프로그램이 문자정보로 변환해야 함
-Scanner 클래스 : 받은 값을 사용자가 원하는 다양한 타입으로 변환하여 리턴

import java.util.Scanner //파일 제일 위에! import문 필요
...
Scanner a = new Scanner(System.in); //Scanner객체 생성


new로 메모리에 올라간 실체 -> '객체'(설계도가 class)
>입력되는 키 값을 공백(' ', '\t', '\n')으로 구분, 아이템 단위: '토큰'(scanner 객체는 빈칸으로 끊어 토큰 단위로 읽는다.)

Scanner scanner = new Scanner(System.in);
// Kim Seoul 20 65.1 true
String name = scanner.next(); //점연산,,
String city = scanner.next();
int age = scanner.nextInt();

<Scanner 클래스의 주요 메소드>
-String next : 다음 토큰을 문자열로 리턴(공백이 낀 문자열을 읽을 수 없음)
-int nextInt : 다음 토큰을 int 타입으로 리턴
-String nextline() : '\n'을 포함하는 라인을 읽고 '\n'을 버린 나머지 문자열 리턴
-scanner.close() : Scanner 사용 종료

> 끝나면 System.in도 같이 끝! 더 이상 키 입력을 받을 수 X

-nextLine() : 공백이 포함된 문자열을 읽을 수 O (enter 나오기 전까지!)
-boolean hasNext() : 현재 입력된 토큰이 있으면 true, 아니면 다음 입력이 있을 때까지 무한정 대기,, 새로운 입력이 들어올 때 true 리턴. ctrl+z가 입력되면 입력 끝. 끝나면 false리턴.

-연산자 우선 순위,, 그냥 무조건 괄호처리!(명확하게)

-조건연산자 ?:

condition? opr2 : opr3 //ex) int s = (x>y)? 1:-1;
여기서 condition=true > opr2
condition=false > opr3

-비트(bit): 2진수로 표현된 데이터의 1자리 자릿수. 8개의 비트 > 바이트(byte)
-비트 논리 연산 : 피연산자의 각 비트들끼리 이루어지는 AND, OR, XOR, NOT의 논리 연산
-비트 시프트 연산 : 3개의 연산자를 이용하여 새로운 비트를 오른쪽이나 왼쪽 끝에 삽입하면서 비트의 자리를 이동시키는 연산
-case문 -> case 뒤에 상수만 가능

>정수, 문자, 문자열리터럴 허용! (실수 X)

좋은 웹페이지 즐겨찾기