- 어셈블 언어 - 인간이 이해하기 쉽도록 기계어와 거의 일대일로 대응하는 기호로 표현된 언어
- 이진법과 우리가 평소에 쓰는 언어들을 규칙을 갖고 일대일로 매칭시켜 놓은 것
- 고급 언어로 기술하는 것보다 어려움
- 고급 언어 - 사람을 기준으로 이해하기 쉬운 언어를 고급 언어라 한다
- ex) C/C++, JAVA 등
- C++의 경우 memory를 건들기 때문에 쉽지만은 않다
- 어셈블러는 번역하는 프로그램
- assemble - 변역하는 것
- 소스코드를 플랫폼에 독립적인 명령어로 구성된 이진 표기로 변환한 파일
- JVM은 바이트 코드를 특정 플랫폼(OS)에 맞는 기계어 파일로 변환하는 역할
- 변환하는 과정에서 한 단계를 더 거쳐 속도 조금 느리지만 고려할 정도는 아니다
- file내에서 .class로 되어 있는 파일
- 소스파일 --(컴파일)--> 바이트 코드 --(인터프리터=JVM)--> OS
- 컴파일 - 고급 언어로 작성된 언어를 기계어가 이해할 수 있게 번역하는 것
- 컴파일러 - 컴파일 하는 프로그램
- 인터프리터 - 고급 언어로 작성된 코드를 한 단계씩 해석하여 실행시키는 것
- ex) JVM(java virtual machine), 통역관 역할
- 컴퓨터가 입력을 받아들일 준비가 되었다는 것을 사용자에게 나타내어 주기 위해 컴퓨터 단말기 화면에 나타나는 신호
- cmd
- 명령프롬프트 - command prompt
- window 명령어 처리기
- 명령어
div //현재 목록 보기 cd \ //directory 위치 잡는거 초기화 = 처음으로 cd (폴더) //change directory dir //directory copy con //문자 복사
- 컴파일 : javac 파일명
- 실행 : java 파일명
- python에서 실행환경을 위해 pip, install 했던 것들이 java에서는 pom.xml에 넣고 저장하는 과정
- install, pom.xml을 이용해 각 언어들 lib 추가 가능
- 파일 - 컴퓨터 내에서 의미를 가지는 논리적인 단위
- 텍스트 파일 - 문자 그대로 저장
- 바이너리(binary) 파일 - 이진 형태로 저장 (프로그램 입장에서 편함)
- 확장자 - program을 결정, file을 구분해줌 - 오른쪽에서 시작해 처음으로 나오는 .(dot)까지
- java file 확장자 - pdf 1-3 참고
- jar(java archive) - 클래스 내에 리소스 파일, 메타 데이터를 포함해 패키징
- war(web archive) - 웹과 관련된 모든 내용들 패키징
- ear(enterprise archive) - jar + war 패키징
- 폴더(directory) - 다수의 파일을 포함
- java program의 (단위=unit)이고 대소문자를 구분
- 하나의 클래스는 하나의 소스 파일
- 제품(객체)을 위한 틀, 설계도
- 객체 - 메모리에 생성되어 만들어진 형태
- 객체 = 속성 + 행동
- 변수와 메소드로 구성
- 인스턴스화 - Class를 이용해 객체를 생성하는 것
- 인스턴스 – 인스턴스화 해서 만들어진 객체
- public을 사용하는 Class 존재 안할 수 있지만 존재한다면 소스 파일과 이름 무조건 일치, 하나만 존재 가능
- 생성자 정의 할 때 변수 = 참조형 변수
- .(dot) 이용해 객체에 접근
- 필드 - 속성 - 소속변수(member variables)
- 객체의 참조 변수를 포함한 local 변수의 경우 stack에 저장
- 자료형
- 기본형
- 상수, 변수, 레터럴 등 단어에 집착하지 말고 의미 신경
- 상수 - 불린형, 정수, 실수, 문자형, 문자열
- 기본형
- 정수 - int type
- 초기값 없는 경우 기본값 0으로
- 실수 - double type
- 초기값 없는 경우 0.0으로 초기화
- 문자형
- 초기값 없는 경우 기본값 '\0', '\u0000'
- 하지만 char type 경우 기본값 대신 공백으로 초기화
- 기본형이 아닌 변수 타입 선언 시 마지막에 변수 타입의 첫 글자 적어줌
- 숫자 표기법
- 앞에 진수 정의 쓰고 2진수로 0000_0000 형태로 변수 이용 가능
- 진수(0b)뒤에 첫번 째 자리 = 부호 bit
- short의 경우 연산은 int로 해야 됨, 아니면 short를 연산 앞에 정의해줘야된다
- ex) (shrot)(s1 + s2)
- 10진수
- e : 승 표현
- 2진수
- ex) int 0b10 - 0b표현
- 16진수
- ex) int 0x10 : 0x 표현
- p : 16진수의 승 표현, p+1 등
- 8진수
- ex) int 010 : 0표현
- 참조형
- 지칭하는 것의 메모리 주소 가리킴
- 링크와 유사
- 초기 값 없는 경우 기본값 null
- class 기반 타입 지칭
- bit 표현 자료형 연산
- 덧셈 - 정상적으로 수행
- 뺄셈 - 정상적으로 수행 X
- 2의 보수 이용해 개선
- 보수 : 논리회로 로직사용
- 연산 기호 (~)
- 1의 보수(0,1 반대로 다 바꾸고) 처리 이후 2의 보수(마지막 자리에 +1)
- 오버플로우, 언더플로우
- 오버 - max 값에 bit 1을 더한다고 더 커지지 않음
- 언더 - min 값에 bit 1을 빼준다고 더 작아지지 않음
- 문자형
- 공백 or null 표시 필요, 공백이랑 null은 다른 것
- data type별로 연산하는 방법들이 다르다는 것을 깔고 가야됨
- 예를 들어 숫자형은 사칙 연산, 문자형은 길이 호출, 특정 구간 제거 등
- 변수의 data type을 정의해주는 것이 변수를 사용함에 따라 data type을 판단하는 수고를 덜어준다
- CASTING에서 형변환을 정의해주는 경우 명시적 형변환이라 부름
ex) int x = (int) 1.54;
- import를 통해 class를 바로 사용할 수 있게끔 하는데 이는 프로젝트에 라이브러리를 폴더 형식으로 추가한 경우도 클래스 위치를 마찬가지로 import해 사용 가능
- primitive
- 원시적인, 기본 data type
- boolean, int, double, short, long, float, char
- 데이터 생성 시 같은 값의 데이터에 대해 동일한 주소 참조
- non primitive
- primitive가 아닌 경우
- String, Array, Date, File 등
- 문자열 정의
- new 사용해 정의
- 데이터 생성 시 객체 생성이라 볼 수 있다
- 서로 다른 주소 참조
- 비교 연산자 사용 X, equals 사용
- new 없이 정의
- primitive와 같음
- 하지만 원시 데이터가 아닌 경우 equals 사용 추천
멤버 변수
- class 내부에서 사용, 초기화 없이 사용 가능
- static 유무로 class 변수, instance 변수 나뉨
- 속성 값 가지고 있기 때문에 영역 X
- stack에 저장
지역 변수
- 메소드 내부에서 사용
- 메소드 내부에서만 사용 가능하고 메소드 벗어나면 메모리에서 사라짐
- 초기화 없이 선언만으로 사용 가능하지만 컴파일 시 오류 발생, 반드시 초기화 필요
- 언더바 ( _ ) 주로 사용
- heap에 저장
- Static사용한 경우 클래스 변수,클래스 메소드
- 클래스에 소속된 저장공간이 하나만 존재하는 변수
- 클래스 메모리에 올라갈 때 자동 생성
- 객체를 만들 때 객체 입장에서 값 수정이 필요 없는 경우 = 멤버 변수 중에 모든 인스턴스들이 공통으로 사용하는 것에 static 붙인다
- 객체 없이 사용 가능
- ex) 클래스이름.메서드이름(매개변수)
- Static이 붙은 경우 붙지 않은 인스턴스 변수, 메소드 사용 불가, 하지만 반대(=인스턴스 변수나 메서드에서는 static이 붙은 멤버들 사용)는 가능
- 프로그램의 실행 속도 향상을 위해 사용하지 않는 변수들 static 붙일 것을 고려
- 안 붙인 메소드는 실행 시 호출되어야 하므로
- 이는 찾아가는 과정이 추가된다는 의미
인스턴스 변수
- 인스턴스 변수를 필요로 한다 -> 인스턴스를 생성해야만 호출 할 수 있음 = 객체 생성 후에만 호출가능
- 추상클래스
- 미완성 설계도라 생각
- 직접 객체화 불가
- 생성자 사용해 객체를 생성할 수 없다는 것 의미
- 다른 클래스에 의해 상속되어야 하는 것이 포인트
- 하위클래스가 있어야 의미가 있고 그렇기에 final 키워드 사용 X
- 생성자가 있으며, 멤버 변수와 메서드도 가질 수 있다
- 상속계층도에서 맨 위에 위치한 모든 하위클래스들의 공통점이라 볼 수 있다
- 적어도 하나 이상의 추상 메소드를 가진 경우 반드시 추상 class
- 추상메소드
- 미완성 메소드
- 구조
- abstract (리턴타입) (메서드이름)( );
- 선언부만 작성하고 구현부는 작성하지 않은 채로 남겨둠
- 몸체 없이 바로 세미콜론 이용해 삽입
- 메서드의 내용이 상속받은 클래스에 따라 달라질 수 있으므로 상위클래스에서 선언부만 작성하고 주석을 덧붙여 어떤 기능을 수행할 목적으로 작성했는지 알려주고 실제 내용은 상속받은 클래스에서 구현하도록 비워두는 것
- 상속받은 하위클래스에서 오버라이딩해서 사용
- 만약 상위 클래스에 추상 메서드 중 하나라도 구현하지 않는다면 상속 받은 하위 클래스 역시 추상클래스로 정의 해줘야 된다
- 추상클래스와 유사
- 하지만 인터페이스는 추상화 정도 더 커 몸통을 갖춘 일반 메소드 또는 멤버 변수를 구성원으로 가질 수 없음
- 추상 클래스는 일반적인 메소드 + 추상 메소드 가능하지만 인터페이스는 only 추상 메소드
- 해야 할 작업의 구체적 구현 없이 기능만 선언한 클래스
- 하위 클래스가 수행해야 되는 메소드와 필요한 상수만 미리 추상적으로 정의
- 조건
- 모든 멤버 변수는 public static final이어야 하며 생략 가능
- 모든 메서드는 public abstract이어야 되며 생략 가능
- static메서드와 디폴드 메서드는 예외
- 일반적인 상속과 똑같이 참조 변수로 참조 가능 + 다중 상속 지원
- 인터페이스를 상속받은 하위 클래스는 모든 추상 메소드를 구현 필요
- 전부 정의 안할 시 마찬가지로 하위클래스 추상클래스로 정의 필요
- 다형성과 마찬가지로 인터페이스를 A라는 클래스가 구현했을 때 인터페이스를 일반적인 class type처럼 사용 가능
- 메서드의 매개변수의 type으로도 사용 가능하다
- 이 경우는 인터페이스를 구현한 클래스의 객체를 매개변수로 제공해야 한다는 것
- return type으로도 지정 가능
- 이는 메서드가 해당 인터페이스를 구현한 클래스의 인스턴스를 반환한다는 것을 의미
- Public or default만 사용 가능
- 조금 더 유연한 class라 생각하면 될 것 같다
- 프로그램의 원하는 형태, 구체적인 구동 방법은 우리가 직접 정의해 사용할 수 있기에
- 버그는 있을지언정 호환되지 않는 문제는 없을 것
- 값(=변수) 선언 가능
- class에 자동으로 implements된다
- 모든 클래스의 최고 조상
- 모든 클래스에서 바로 사용 가능(=extends 사용 안해도 확장됨, 확장 키워드 필요 없음)
- 문자열을 위한 class
- Final로 정의되어 있어 변경 불가
- 이용해 문자열 결합하는 경우 인스턴스 내에 문자열 바뀌는 것이 아니라 새로운 문자열이 담긴 string인스턴스가 생성되는 것
- 메모리 위해 가능한 적게 연산하는 것이 효율적, StringBuffer class로 개선 가능
- 문자열 리터럴,생성자 두 가지 방법으로 문자열 생성 가능
- 리터럴의 경우 문자열이 동일하면 주소 값도 동일
- 리터럴 생성 시 해당 클래스에 리터럴->리터럴 같은 경우 모두 똑 같은 메모리 참조
- 생성자의 경우 문자열 같아도 주소값 다름, 객체가 다르기 때문
- String type의 경우 null보다는 빈 문자열로 초기화하는 것이 보통
- 날짜와 시간
- Calendar 클래스 이후 대부분의 메서드는 calendar에서 가져오고 date는 저장의 용도로만 사용
Calendar
- 추상클래스이므로 직접 객체 생성 불가,메서드 통해서 완전히 구현된 클래스의 인스턴스 얻어야한다
- getInstatnce()이용
- calendar class를 구현한 클래스의 인스턴스를 반환한다
- static인 이유 : 메서드 내의 코드에서 인스턴스 변수를 사용하거나 인스턴스 메서드를 호출하지 않기 때문
- static이 아니라면 객체를 생성하고 호출해야 되는데 calendar가 추상클래스이므로 불가
- 원시타입 + 타입변수(=타입 매개변수, = 지네릭타입)로 이루어져있음
- 타입변수 자리에 특정 타입을 지정해 호출한다면 특정 타입(=매개변수화된 타입 = 대입된 타입)
컴파일 후에 원시타입으로 바뀌는 것에 대해 ????????????????- 지네릭 타입이 아닌 클래스의 타입 간에 다형성을 적용하는 것은 가능, 이 때도 지네릭 타입은 일치해야됨
- 지네릭 클래스를 이용해 특정 타입의 자손 객체만 저장하고 싶은 경우 462p
- 초기화 블럭
- 클래스 초기화 블록 : 클래스 변수 초기화에 사용
- 인스턴스 초기화 블록 : 인스턴스 변수 초기화에 사용
- 클래스 변수(cv)가 인스턴스 변수(iv)보다 먼저 초기화
- 인스턴스 초기화 블록은 인스턴스가 필요하기 때문
- 명시적 초기화 - 변수를 선언과 동시에 초기화
- 절대적이진 않지만 해도 나쁠게 없음, 물론 불필요한 경우도 충분히 존재
- 참고
- 변수
- 멤버 변수
- 클래스 변수
- 인스턴스 변수
- 지역 변수
- Public :어디서든 접근 가능
- Protected :같은 패키지 내에서와 다른 패키지에서는 상속한 class만 접근 가능
- (Default) :같은 package내에서만 사용 가능접근 지정자 생략한 경우
- Private : class내에서만 접근 가능
- (Static =정적):필드,메소드 소속을 클래스로 제한하는 키워드
- 멤버 변수 중에 모든 인스턴스들이 공통으로 사용하는 것에 static 붙인다
- static 내부에서는 this, super 사용 못함
- parameter, return 값으로 이루어질 수 있으며 둘 다 필 수는 아니다
- return type 함수 이름 앞에 작성
- ex) return 값 없는 경우 - void
- public static void main(String[] args){}
- 특별한 함수
- 프로그램의 starting point라 생각하면 된다
- main없이 실행하는 방법
- 단위 test인 jUnit framework 사용(@Test 선언된 메소드 실행)
- server와 browser로 실행
- 메소드의 특정 내용을 실행하기 위해 영역이 필요
- 참고
- close 함수
- 하나의 프로그램이 하나의 파일을 잡고 있다면 다른 프로그램들을 읽기는 가능하지만 쓰지는 못함
- 독점 작업을 해주고 반드시 놔줘야 한다
- 단순하게 인스턴스를 시작할 때 인스턴스의 변수 및 메소드 초기화를 위해 사용하는 특별한 메소드
- 구조는 메소드와 유사하지만 return 값이 없다
- 반환이 없지만 그렇다고 void 사용 안함
- 이름은 반드시 클래스 이름, 인자의 유무는 때에 따라 유동적
- 주로 접근지정자로 public사용
- 다른 접근지정자들도 사용 가능
- 생성자는 단순하게 인스턴스 변수들의 초기화에 사용
- 객체를 생성하는 것은 new 키워드
- 임의로 생성자 구현 안한 경우 기본생성자 따로 정의 안해도 자동으로 정의됨
- 만약 임의로 생성자 구현했다면 기본 생성자 자동으로 정의 X
- constructor overloading - 생성자 오버로딩
- 같은 이름으로 여러 생성자 구현 가능
- parameter들의 type만 인식하지 변수의 이름을 보지 않기 때문
- method 이름은 같지만 parameter만 다른 경우들
- 기본 생성자인 경우 인스턴스 생성한 이 후 인스턴스 변수들 따로 초기화 필요
- 매개변수가 있는 생성자는 인스턴스가 생성과 동시에 생성자 값으로 초기화 됨
- 생성자
- class 호출하는 method
- 생성과 동시에 초기화하고 싶은 경우
- class type과 동일한 이름의 method가 존재한다면 해당 method에 매개변수 이용해 초기화
- 객체지향과 대비되는 말로 프로그램을 순서에 맞게 단계적으로 실행함
- 데이터의 속성보다는 명령어의 순서와 흐름에 포커싱
- 기능들이 복잡해지면서 추가 개발이나 유지보수가 어려운 한계 존재
- method를 이용해 부품을 만들고 프로그램 만듬
- https://velog.io/@sung-ik-je/%EA%B0%9D%EC%B2%B4-%EC%B6%94%EC%83%81%ED%99%94
- 절차 지향의 method만을 이용하기에는 한계를 느낌
- class(method + variable)를 이용해 부픔을 만들고 프로그램 만듬
- 클래스 class
- 서로 연관된 같은 주제를 가지고 있는 변수와 메서드를 그룹화한 껍데기
- 멤버
- ex) 클래스 멤버 변수 - 클래스 소속 변수 뜻함
- 객체 자신을 의미하는 키워드
- 변수들의 이름 같은 경우 멤버변수와 지역변수 구분하기 위해 사용
- 생성자를 사용하는 객체가 아닌 본인이 속해 있는 필드 가리킴
- This 있는 경우 생성자가 속해있는 class의 변수(=멤버 변수)를 가리킴
- ex) this.color = color;
- This 없으면 만들어질 객체의 변수(=지역 변수)로 취급
- 만들어질 객체의 초기값
- 생성자의 매개변수
- 생성자 내에서 한번만 사용 가능
- 자식 클래스를 가리킴
- 상위 클래스에서 하위 클래스 지칭 할 때 생성자의 입장에서는 this 사용하면 만들어질 인스턴스의 변수로 초기화
- this.a = 2;
- 생성자를 사용하는 객체(=자식 클래스)의 a라는 변수를 2로 초기화
- 생성자로 만들어질 객체를 초기화하는데 사용하는 것과 같은 말
- 상위 객체를 의미하는 키워드
- 하위클래스에서 상위 클래스의 변수 지칭할 때 사용
- 변수의 이름이 같을 때 구분을 위해 super사용
- super.변수
- 상위class의 변수 가리킴
- 상속된 하위 클래스에 상위 클래스와 동일한 이름의 변수 없을 경우에는 하위 클래스에서 this 이용해 상위클래스의 변수 접근 가능하지만 대부분 super이용
- this와 super은 조상의 멤버와 자신의 멤버를 구별하는데 사용된다는 점만 제외하면 근본적으로 같다
- this, super이용해 반대로 접근 가능한 것
- super와 this를 사용할 때 super, this 키워드를 사용하는 클래스 내에 변수와 생성자의 매개변수가 다르다는 사실 유의
- 클래스 내에 변수 vs 생성자 매개변수
같은 클래스의 다른 생성자를 호출할 때 사용
- 상위 클래스의 기본 생성자를 호출하는 문장
- 기본 생성자가 없는 경우 자바컴파일러가 기본적으로 제공
- 조상의 생성자를 호출하는데 사용(생성자는 상속 안되기 때문)
- eclipse에서 클래스, 메서드 우클릭 Quick Type Hierarchy을 통해 해당 클래스, 메서드들의 상속 관계와 포함하고 있는 메서드들을 알 수 있다
- 하위클래스에서 메서드를 사용할 때 상속해준 모든 상위클래스들의 메서드 존재 유무를 파악
- 미리 정의되어 있는 메서드를 사용, 수정(override) 가능
- 메서드는 바로 이전에 상속해주는 상위클래스에 존재할수도, 존재하지 않을 수도 있으며 override된 메서드가 존재하는 경우도 존재
- 만약 상위 클래스에 정의되어 있는 경우 상위 클래스 중 가장 근접한 곳에 정의되어 있는 클래스의 메서드를 따라가고, 정의 안되어 있는 경우 새로운 함수 정의해줘야 한다
- Overloading
- 상속과 직접적인 관련 X
- 클래스 내에서 같은 이름의 메서드를 중복해서 생성하는 것
- 특정 이름을 지닌 메소드가 있다고 할지라도 우리는 같은 이름을 가진 메소드를 또 만들 수 있다
- 다만 파라미터 형식이 달라야 한다
- Override
- 부모 클래스가 갖고 있는 기능을 재정의
- 상위 클래스의 생성자가 있다면 하위 클래스가 상속 받을 때 생성자를 정의해줘야 한다
- 클래스가 데이터 타입에 따라 다양한 형태로 보여질 수 있는 성질(하나의 class가 여러가지 모습을 띌 수 있는)
- 생성자 정의시 interface type 종류에 따라 선언한 변수 영향 받음
- 호환성 문제 존재
- 클래스의 기능이 너무 많아져서, 선택적으로 사용자에게 제공하고 싶어질 때
- 기능이 많으면 자유도는 높지만 복잡성 증가
- 필요 없는 부분은 고려 안하고 필요한 부분들만 사용 가능
- 소문자 이용
- .(dot)이용해 하위 폴더 지정
- directory라 생각
- \=예약어
- \= 자바 자체적으로 미리 정의해 놓은 단어
- 식별자로 사용 불가
- 사용자가 정의한 단어들
- 대소문자 구분
- 밑줄, 달러 기호, 한글 가능
- 첫 문자 숫자 불가, 공백 불가
- 한줄 주석 - //
- 블록 주석 - /* */
- 문서화 주석 - /** 문장 앞에 * 사용 */
- ex) 작성자 표시할 때 사용
- 들여쓰기
- 가독성을 위한 것이지 컴퓨터 입장에선 의미 X
- 참고, 하지만 실무에서 지켜야 되는게 예의
- 헝가리언 - 변수 선언 시 변수 이름 앞에 data type적어줌
- ex) int iMaxSpeed; or String strUserName;
- 파스칼 - 클래스 선언 시 각 문자들의 첫 문자 대문자
- Public class가 있는 경우에 source file name도 첫 문자 대문자가 맞는 것 같음
- 카멜 - 변수, 메소드 선언 시에 처음에 나오는 단어의 첫 글자만 소문자, 두번째 글자부터는 파스칼표기법 따름
- 언더바 (=스네이크) - java에서는 상수를 표현, 나머지 언어들은 필기 참고
- 케밥 - html에서 class 정의 시 언더바 대신 (–)이용
- %d - 숫자 10진수로 출력
- %o - 숫자 8진수로 출력
- %x - 숫자 16진수로 출력(소문자)
- %X - 숫자 16진수로 출력(대문자)
- %f - 소수점 형식으로 출력
- %c - 문자로 출력
- %s - 문자열로 출력
- \==의 경우 주소 값을 비교
- \===의 경우 형식까지 고려
- return 값은 Boolean 값
- 상위로의 자료형변환
- 하위 객체는 상위 클래스형 변수에 대입이 가능
- class 구조 : 사람 > 교직원 > 직원인 경우
- 김사랑은 원래 교직원 class인데 사람 class의 김사람으로 정의
- \= (교직원 김사랑; 을 사람 김사람으로 재정의)
- 김사람은 사람의 변수이므로 사람의 멤버만 접근 가능
- 접근 할 수 있는 변수 줄어듬
- 사람에서 교직원, 교직원에서 직원으로 상속
- 직원이 가장 하위 클래스이며 사용 하는 변수 직원이 가장 많음
- 클래스에 따라 접근할 수 있는 변수가 다르며 상위클래스로 변할 경우 마찬가지로 접근할 수 있는 변수들의 권한이 바뀐다
- 상속 관계가 성립해야 된다
- 상위 클래스 형을 하위 클래스 형으로 변환
- 이 때 반드시 명시적인 형변환 연산자 필요
- 결과는 똑같은데 내용을 효율적으로 만드는 것
- eclipse에서는 refactor 기능 지원
- Java 외부에 존재하는 것들
- 종류
- DB
- Network
- File
- 굉장히 불안전하고 여러가지 상황 초래
- 작업이 끝나면 붙잡고 있던 resouce를 놔줘야됨
- close() 함수 이용
- 보통 finally 이용해 사용