명명규칙
1. 대소문자가 구분되며 길이에 제한이 없다.
2.예약어(Reserved word)를 사용해서는 안 된다.
3.숫자로 시작해서는 안 된다.
4.특수문자는 '_'와 '$'만을 허용한다.(위치는 상관없다 ex : $harp 도 가능)
권장사항
1.클래스 이름 첫 글자는 항상 대문자
2.여러 단어 이름은 단어의 첫 글자를 대문자
3.상수의 이름은 대문자. 단어는 '_'로 구분
문자와 문자열
"" + 7 + 7 -> "7" + 7 -> "7" + "7" -> "77"
7 + 7 + "" -> 14 + "" -> "14" + "" -> "14"
printf()의 지시자
| 지시자 | 설명 |
| %b | boolean : 2진수 |
| %d | decimal : 10진수 |
| %o | octal : 8진수 |
| %x, %X | hexa-decimal : 16진수 |
| %f | floating-point : 소수점 |
| %e, %E | exponent : 지수 |
| %c | character : 문자 |
| %s | string : 문자열 |
이항연산자 특징
이항연산자는 연산을 수행하기 전에 피연산자의 타입을 일치시킨다.
-int보다 크기가 작은 타입은 int로 변환한다.
-피연산자 중 표현범위가 큰 타입으로 형변환 한다.
byte + byte -> int + int -> int 가 된다.
byte a = 10;
byte b = 20;
byte c = a + b; //에러. int값을 byte에 저장 불가
byte c = (byte)a + b; //에러
byte c = (byte)(a + b); //OK
char c1 = 'a';
char c2 = c1 + 1; //에러
char c2 = (char)(c1 + 1); //OK
char c2 = ++c1; //OK
int i = 'B' - 'A'; // i = 1;
쉬프트 연산자 <<, >>, >>>
2^n으로 곱하거나 나눈 결과를 반환한다.
-곱셈, 나눗셈보다 빠르다.
x << n = x * 2^n
x >> n = x / 2^n
연산자 우선순위
괄호 -> 산술 -> 비교 -> 논리 -> 대입
단항(++, --) -> 이항(산술, 비교, 논리) -> 삼항( 조건 ? a : b)
* 비트(<<, >>)는 덧셈 연산자보다 우선순위가 낮다.
* ||, |(or)는 &&, &(and)보다 우선순위가 낮다.
객체와 인스턴스
객체 ≒ 인스턴스
-객체(object)는 인스턴스(instance)를 포함하는 일반적인 의미
클래스 - 인스턴스화 -> 인스턴스(객체)
객체의 구성요소
속성 - 변수
기능 - 메서드
인스턴스 생성과 사용
// 생성
Tv t;
t = new Tv();
Tv t1 = new Tv();
Tv t2 = new Tv();
t2 = t1;
// t1 포인터와 t2 포인터가 같아짐
클래스의 또 다른 정의
클래스 : 데이터와 함수의 결합
변수 - 하나의 데이터를 저장할 수 있는 공간
배열 - 같은 타입의 여러 데이터를 저장할 수 있는 공간
구조체 - 타입에 관계없이 서로 관련된 데이터들을 저장할 수 있는 공간
클래스 - 데이터와 함수의 결합(구조체 + 함수)
선언위치에 따른 변수의 종류
class Variables{
//클래스 영역
int iv; //인스턴스변수
static int cv; //클래스변수(static 변수, 공유 변수)
void method(){
//메서드영역
int lv = 0; //지역변수
}
}
인스턴스변수(instance variable)
-각 인스턴스의 개별적인 저장공간. 인스턴스마다 다른 값 저장가능
-인스턴스 생성 후, '참조 변수, 인스턴스 변수명'으로 접근
-인스턴스를 생성할 때 생성되고, 참조변수가 없을 때 가비지 컬렉터에 의해 자동제거됨
클래스변수(class variable)
-같은 클래스의 모든 인스턴스들이 공유하는 변수
-인스턴스 생성없이 '클래스이름, 클래스 변수명'으로 접근
-클래스가 로딩될 때 생성되고 프로그램이 종료될 때 소멸
지역변수(local variable)
-메서드 내에 선언되며, 메서드의 종료와 함께 소멸
-조건문, 반복문의 블럭{} 내에 선언된 지역 변수는 블럭을 벗어나면 소멸
*인스턴스 변수는 인스턴스가 생성될 때마다 생성되므로 인스턴스 마다 각기 다른 값을 유지할 수 있지만, 클래스 변수는 모든 인스턴스가 하나의 저장공간을 공유하므로 항상 공통된 값을 갖는다.
JVM의 메모리 구조
메서드영역(Method Area)
-클래스 정보와 클래스 변수가 저장되는 곳
호출스택(Call Stack)
-메서드의 작업공간, 메서드가 호출되면 메서드 수행에 필요한 메모리 공간을 할당받고 메서드가 종료되면 사용하던 메모리를 반환
힙(Heap)
-인스턴스가 생성되는 공간. new 연산자에 의해서 생성되는 배열과 객체는 모두 여기에 생성된다.
호출스택 특징
-메서드가 호출되면 수행에 필요한 메모리를 스택에 할당받는다.
-메서드가 수행을 마치면 사용했던 메모리를 반환한다.
-호출스택의 제일 위에 있는 메서드가 현재 실행중인 메서드다.
-아래에 있는 메서드가 바로 위의 메서드를 호출한 메서드다.
클래스메서드(static 메서드)와 인스턴스메서드
인스턴스메서드
-인스턴스 생성 후, '참조변수.메서드이름()'으로 호출
-인스턴스변수나 인스턴스메서드와 관련된 작업을 하는 메서드
-메서드 내에서 인승턴스변수 사용 가능
클래스메서드
-객체 생성없이 '클래스이름.메서드이름()'으로 호출
-인스턴스변수나 인스턴스메서드와 관련없는 작업을 하는 메서드
-메서드 내에서 인스턴스 변수 사용 불가
-메서드 내에서 인스턴스 변수를 사용하지 않는다면 static을 붙이는 것을 고려
class MyMath {
long a, b;
long add() {
return a + b;
}
static long add(long a, long b) {
return a + b;
}
}
class MyMathTest {
public static void main(String args[]) {
System.out.println(MyMath.add(200L, 100L); // 클래스메서드 호출
MyMath mm = new MyMath(); // 인스턴스 생성
mm.a = 200L;
mm.b = 100L;
System.out.println(mm.add()); //인스턴스메서드 호출
}
}
메서드 호출
class TestClass {
void instanceMethod() {} // 인스턴스메서드
static void staticMethod() {} // static메서드
void instanceMethod2() { // 인스턴스메서드
instanceMethod(); // 다른 인스턴스메서드를 호출한다.
staticMethod(); // static메서드를 호출한다.
}
static void staticMethod2() { // static메서드
instanceMethod(); // 에러!! 인스턴스메서드를 호출할 수 없다.
staticMethod(); // static메서드 호출 할 수 있다.
}
}
변수 접근
class TestClass2 {
void iv; // 인스턴스변수
static int cv; // 클래스변수
void instanceMethod() { // 인스턴스메서드
System.out.println(iv); // 인스턴스변수 사용 가능
System.out.println(cv); // 클래스변수 사용 가능
}
static void staticMethod() { // static메서드
System.out.println(iv); // 에러!! 인스턴스변수 사용 불가
System.out.println(cv); // 클래스변수 사용 가능
}
}
메서드 오버로딩(Method Overloading)
-메서드의 이름이 같아야 한다.
-매개변수의 개수 또는 타입이 달라야 한다.
-매개변수는 같고 리턴타입이 다른 경우는 오버로딩이 성립되지 않음
-매개변수의 이름이 다른 것은 오버로딩이 아님
-리턴타입은 오버로딩의 성립조건이 아니다.
this(), this
this() : 생성자, 같은 클래스의 다른 생성자를 호출할 때 사용, 다른 생성자 호출은 생성자의 첫 문장에서만 가능
this : 인스턴스 자신을 가리키는 참조변수. 인스턴스의 주소가 저장되어있음. 모든 인스턴스 메서드에 지역변수로 숨겨진 채로 존재
변수 초기화
-멤버변수(인스턴스 변수, 클래스 변수)와 배열은 각 타입의 기본값으로 자동 초기화 되므로 초기화를 생략할 수 있다.
-지역변수는 사용 전 무조건 초기화를 해야 한다.
초기화 하는 방법은 값을 넣어 주는 것으로 할 수 있다.
//틀린 예시
class Test{
int j = i;
int i = 10;
}
//옳은 예시
class Test{
int i = 10;
int j = i;
}
멤버변수 초기화
1. 명시적 초기화(explicit initialzation)
class Car {
int door = 4; //기본형(primitive type) 변수의 초기화
Engine e = new Engine(); //참조형(reference type) 변수의 초기화
//...
}
2. 생성자(constructor)
Car(String color, String gearType, int door){
this.color = color;
this.gearType = gearType;
this.door = door;
}
3. 초기화 블럭(initialization block)
인스턴스 초기화 블럭 : { }
-생성자에서 공통적으로 수행되는 작업에 사용되며 인스턴스가 생성될 때 마다 (생성자보다 먼저) 실행된다.
-인스턴스 변수 초기화 시점 : 인스턴스가 생성될 때 마다
클래스 초기화 블럭 : static { }
-클래스 변수의 복잡한 초기화에 사용되며 클래스가 로딩될 때 실행된다.
-클래스가 처음 로딩될 때 단 한번
상속 vs 포함
상속관계 : '~은 ~이다. (is-a)'
포함관계 : '~은 ~을 가지고 있다. (has-a)'
*Java는 단일상속만 허용하기 때문에 비중이 높은 클래스 하나만 상속하고, 나머지는 포함관계로 한다.
오버라이딩(overriding)
부모클래스로부터 상속받은 메서드의 내용을 상속받은 클래스에 맞게 변경하는 것을 말함
조건
1. 선언부가 같아야 한다.(이름, 매개변수, 리턴타입)
2. 접근제어자를 좁은 범위로 변경할 수 없다.
-부모의 메서드가 protected라면, 범위가 같거나 넓은 protected 또는 public으로만 변경할 수 있다.
3. 부모클래스의 메서드보다 많은 수의 예외를 선언할 수 없다.
오버로딩 vs 오버라이딩
오버로딩(overloading) - 기존에 없는 새로운 메서드를 정의하는 것(new)
오버라이딩(overriding) - 상속받은 메서드의 내용을 변경하는 것(change, modify)
super
this : 인스턴스 자신을 가리키는 참조변수. 인스턴스의 주소가 저장되어 있음. 모든 인스턴스 메서드에 지역변수로 숨겨진 채로 존재
super : this와 같음. 부모의 멤버와 자신의 멤버를 구별하는데 사용
class Point {
int x;
int y;
String getLocation() {
return "x :" + x + ", y :" + y;
}
}
class Point3D extends Point {
int z;
String getLocation() { //오버라이딩
return super.getLocation() + ", z :" + z; //부모 메서드 호출
}
}
'Language > Java' 카테고리의 다른 글
| Java의 정석 정리 3 (0) | 2023.09.15 |
|---|---|
| Java의 정석 정리 2 (0) | 2023.09.10 |
| 강의 내용 정리 2 (0) | 2023.03.08 |
| 강의 내용 정리 1 (0) | 2023.03.04 |
| 기초 내용 정리 모음 (2) | 2023.02.22 |