데이터의 종류
논리형(boolean), 문자형, 숫자형
byte 8bit
short 16bit
int 32bit -> overflow 주의
long 64bit
float 32bit
double 64bit
-> 실수 연산은 부정확함(유효 자리수를 이용한 반올림 처리)
float var1 = 10.0 //Type mismatch: cannot convert from double to float 오류남
float var1 = 10.0f
또는 double var1=10.0
으로 작성해야함
char 16 bit
-> 기억할 ASCII 코드 ('0' = 48, 'A' = 65, 'a' = 97)
묵시적 형 변환은 타입의 크기가 아니라 표현 범위가 커지는 방향으로 할당할 경우에 발생하며, 자료의 손실이 없기 때문에 JVM이 알아서 해주는 반면, 명시적 형 변환은 값 손실이 발생할 수 있기 때문에 형 변환한다고 ()
를 이용해서 작성해줘야한다.
최후위연산자 : 대입연산자
최전위연산자: 괄호
변수의 초기값은 일반적으로 부정적인 의미로 두는 게 좋다.
논리연산자 || 을 사용할 때, 앞이 True이면 뒤에는 실행하지 않기 때문에 앞이 True인게 좋다.
&&을 사용할 때는 앞이 False인게 좋다.
piblic static void main(String[] args){
a=10;
b=20;
System.out.println((a+=10) > 15 || (b-=10) > 15); // true
System.out.println("a = " + a+", b = " + b); // a=20, b=20
}
type이 동일한 데이터를 하나의 연속된 메모리 공간에서 관리하는 것
{}
을 통한 배열 생성은 변수 선언과 동시에 진행해야함boolean [] bools;
bools={true,false,false};
//------------위처럼 하면 오류남
boolean[] bools= new boolean[]{true,false,false}; // 맞는 표현
OOP(Object Oriented Programming)
객체? 주체가 아닌 것, 주체가 활용하는 것
객체지향 프로그래밍? 주변의 많은 것들을 객체화해서 프로그래밍 하는 것
장점 : 신뢰성 높은 프로그래밍 가능, 추가,수정,삭제가 용이함, 재사용성이 높음
프로그래밍 -추상화-> 클래스 -구체화-> 객체
현실의 객체가 갖는 속성과 기능이 추상화(abstraction)되어서 클래스에 정의됨
클래스는 구체화가 되어서 프로그램의 객체(instance,object)가 됨
Class Area, Method Stack, Heap으로 이뤄져 있다.
클래스 원형 로딩하는 곳(Field 정보, Method정보, 타입 정보, 상수 풀)
메서드들의 실행 공간
thread별로 별도로 관리한다.
메서드 호출 순서대로 이 스택에 쌓인다.
메서드 프레임에 로컬 변수도 쌓임
로컬변수는 선언된 영역을 벗어나면 삭제된다.
객체를 저장하기 위한 영역
thread에 의해서 공유된다.
생성된 객체는 프로그래머가 삭제할 수 없고 GC(Grabage Collector)만이 제어할 수 있다.
인스턴스 멤버 변수
객체가 만들어질 때 객체 별로 생성되고 생성되는 메모리 영역은 heap이다.
소멸 시점은 GC에 의해 객체가 없어질 때이며 명시적으로 소멸시킬 수 없다.
클래스 멤버 변수
static
키워드를 붙여서 선언한다.
클래스 영역에 클래스 로딩 시에 메모리 등록함
소멸 시점은 프로그램 종료할 때이다.
지역변수 & 파라미터 변수
선언된 라인이 실행될 때 thread별로 생성된 stack에 생성된다.
소멸 시점은 선언된 영역이 {}을 벗어날 때 이다.
메서드 : 기능처리
메서드 접근 : 메모리에 호출하려는 멤버가 있으면 호출 가능, 없으면 먼저 메모리에 로딩 후 사용
static member는 클래스 로딩 시에 자동으로 등록되기 때문에 언제나 메모리에 있다.
instance member는 객체 생성 전에는 메모리에 없다.
오버로딩은 동일한 기능을 수행하는 메서드의 추가 작성
println, printf등도 오버로딩의 일종이다.
메서드 이름은 동일하고 인자값의 갯수나 인자값의 type등이 달라야 오버로딩이다.(return type은 상관없다.)
오버로딩의 장점은 중복 코드에 대한 효율적인 관리가 가능하다.
오버라이딩은 부모클래스에서 정의된 메서드를 자식 클래스에서 적합하게 수정하는 것
조건
참조 변수, 객체 자신을 가리킨다. (객체 참조)
로컬 변수와 멤버 변수의 이름이 동일할 경우 this를 사용해서 멤버 변수임을 명시적으로 나타낼 수 있다.
메서드와 마찬가지로 생성자도 오버로딩 가능함.
맨 첫줄에서만 호출 가능함
객체 생성 시 필요한 멤버 변수만 초기화 진행 -> 생성자 별 코드의 중복 발생
한 생성자에서 다른 생성자를 호출할 때 사용
조상 클래스 멤버에 접근
조상 클래스의 생성자 호출
맨 첫줄에서만 호출 가능하다.
this() or super()를 호출하지 않으면, 컴파일러가 super()를 삽입해준다.
추상화 , 다형성, 상속, 데이터 은닉과 보호
추상화: 현실의 객체를 추상화 해서 클래스를 구성함
다형성: 하나의 객체를 여러가지 타입으로 참조할 수 있다.
상속: 부모 클래스의 자산을 물려받아 자식을 정의함으로 코드의 재사용이 가능하다
Encapsulation: 데이터를 외부에 노출 시키지 않고 메서드를 이용해서 보호할 수 있다.
모든 클래스는 Object class를 상속 받는다.
상속의 관계는 is a
관계라고 한다.
자바는 단일 상속만 가능하며, interface의 포함관계(has a
관계)로 다중 상속할 수 없다는 단점을 극복할 수 있다.
JVM,컴파일러,프레임워크 등이 보는 주석
객체의 주소 비교 : ==
객체의 내용 비교 : equals 재정의
시스템에서 객체를 구별하기 위해서 사용되는 정수 값으로, 객체의 해시 코드를 사용한다.
패키지 : 의미 있는 이름으로 만들고 .을 통해서 계층적 접근 모든 클래스는 반드시 하나의 패키지에 속함 default package가 만들어지기는 하지만 안쓰는게 좋음 package 일반적인 naming룰 소속.프로젝트.용도 도메인이 쓰이면 거꾸로 쓰면됨 ex) com.ssafy.hrm.common -> hrm프로젝트, 용도는 일반적이다,
다른 패키지에 선언된 클래스를 사용하기 위해서 필요한 키워드 패키지와 클래스 선언 사이에 위치 패키지와 달리 여러 번 선언 가능 default import package는 java.lang.*
제한자 : public, protected, default(=package), private
그 외: final, abstract, static, synchronized
final 마지막, 더 이상 바뀔 수 없음 용도 final class - 더 이상 확장 할 수 없다. 상속 금지-> 오버라이드 방지 final method -> 더 이상 재 정의 할 수 없음 오버라이딩 금지 final variable 더 이상 값을 바꿀 수 없다. 상수
protected : 상속 받은 클래스, 같은 패키지에서만 접근 가능(다른 패키지의 자손 클래스도 ok)
default: 자신 클래스 내부와 같은 패키지내에서만 접근 가능
private : 외부에서 접근 불가능, 같은 클래스 내에서만 접근 가능
외부에서 생성자에 접근 금지 -> 생성자의 접근 제한자를 private으로 설정 내부에서는 private에 접근 가능하므로 직접 객체 생성 -> 멤버 변수이므로 private설정 외부에서 private member에 접근 가능한 getter생성 -> setter 불필요 객체 없이 외부에서 접근할 수 있도록 getter와 변수에 static추가
외부에서는 언제나 getter를 통해서 객체를 참조하므로 하나의 객체 재사용
public class B extedns A {}
A a = new A();
B b = new B();
A a = new B();
//B b= new A();는 불가, 하위 클래스를 만드는데 상위 클래스 참조 불가