티스토리 뷰

JAVA

자바를 자바라

세댕댕이 2021. 10. 14. 20:27

[#1. JAVA의 특징]

 

1. 간결한 프로그래밍 문법

- C/C++에서 머리 빠개지는 포인터 개념이 없다

- Garbage Collector가 메모리 관리 알아서 처리

 

2. 이식성이 높다

- JVM(Java Virtual Machine) 사용. 운영체제에 영향받지 않는다. = 플랫폼에 독립적.

- Write Once, Run Anywhere

 

3. 객체지향 언어

- OOP(Object Oriented Programming) - 캡슐화, 상속, 다형성

 

4. 멀티 쓰레드 구현, 병렬 처리

5. 다양한 응옹 프로그램 작성 가능 - 애플릿, JSP, 서블릿, 임베디드 프로그램, 모바일 앱 등등..

6. 오픈 소스 라이브러리 풍부

 

# JRE와 JDK 

JRE(Java Runtime Enviroment)

JDK(Java Development Kit)

 

자바 프로그램을 실행만 할거라면 JDK는 필요없이 JRE만 설치하면 된다 (JVM은 알아서 딸려온다)

개발을 하기 위해서는 컴파일러, 디버거 등이 포함된 JDK를 설치해야 한다.

 

 

#★ JAVA 코드가 실행되는 과정

 

# 바이트 코드란?

- 고급 언어로 작성된 코드를 JVM이 이해할 수 있는 언어로 변환된 코드. 고급 언어와 기계어의 중간다리 수준.(like 어셈블리어?)

- 명령어 크기가 1바이트라서 바이트 코드라고 불린다.

 

# 왜 바이트 코드가 필요할까? 고급 언어에서 기계어로 바로 바꾸면 안될까?

-> 바이트코드는 가상머신에서 돌아가는 프로그램을 위한 언어 표기법이다. 

-> 같은 print 명령어라도 윈도우 OS에서 쓰이는 기계어와 맥 OS에서 쓰이는 기계어는 다르다. 그렇기 때문에 JVM이 공통적으로 이해할 수 있는 정도로 1차 번역을 거치고, OS에 따른 번역은 각 OS에 맞는 JVM이 처리하도록 하는 것.

 

* 컴파일 시에 주석은 번역하지 않는다

 

 

# JVM의 역할

1. 운영체제에 구애받지 않고 자바 프로그램을 실행할 수 있게 해준다.

2. 메모리 관리를 수행한다 (GC)

 

# JVM의 구조

1. Class Loader: JAVA 바이트코드 파일을 JVM 내부로 로드한다.

 

2. Execution Engine: 바이트코드를 해석하고 실행한다(바이트 코드를 기계어로 변환)

- JVM 내의 Runtime Data Area에 배치된 바이트 코드를 명령어 단위로 읽어 실행한다.

- 인터프리터, JIT 컴파일러, GC

 

3. Runtime Data Area: 프로그램 수행을 위해 OS에게 할당받은 메모리 공간.

- Heap: 동적으로 생성된 객체(new 명령어로 생성된 객체)가 저장되는 영역. GC가 관리. 모든 스레드에 공유

- Method Area: 클래스, 인터페이스, 메서드, static 변수 정보 등 저장. 모든 스레드가 공유

- Stack: 메서드를 호출할때마다 프레임을 스택에 push.

        > 메서드 내에서 사용되는 지역변수, 매개변수, 리턴값 등 저장. 각 스레드마다 존재

        > 메서드를 종료하면 프레임을 스택에서 pop.

- PC Register: 현재 수행중인 JVM 명령어 주소를 저장. 각 스레드마다 존재.

- Native Method Stack: 자바 외 다른 언어(C++ 등)의 동작을 위해 할당된 영역. 각 스레드마다 존재

 

이것이 자바다 신용권, 한빛미디어, 2015

 

* 자바에서 동적으로 객체를 생성하는 경우

-> 실제 객체는 Heap 영역에, 객체 주소를 담고있는 변수는 Stack 영역에 저장된다.

 

* static 변수는 클래스 레벨에 붙는다는 이야기가 클래스랑 static 변수랑 같은 영역에 저장되있기 때문.

 

4. Garbage Collector

- 힙 영역에 생성된 객체 중, 참조되고 있지 않은 객체를 탐색 후 제거한다.

 

 

 

# 최종 요약

1. 자바로 코드를 짠다 (*.java)

2. javac 컴파일러가 바이트 코드(*.class)로 컴파일한다.

3. JVM의 Class Loader가 바이트 코드를 JVM 내부로 로딩한다

4. 로딩된 바이트 코드는 Runtime Data Area에 실행가능한 상태로 배치된다

5. Execution Engine이 배치된 바이트 코드를 실행시킨다

> 5.1 - main 메서드가 Method Area에 맨 처음 올라간다 (Entry Point, 진입점)

> 5.2 - main 메서드 속 지역변수는 Stack 영역에, 동적 변수와 객체들은 Heap 영역에 저장된다

> 5.3 - 메소드가 호출되면 새로운 스택을 생성. 지역변수를 해당 스택에 담아놓고 사용, 메소드가 종료되면 스택을 비우고 제거.

> 5.4 - 참조가 끊어진 객체는 GC가 수거한다

 

- 위 과정을 반복한다 -

 

 

[#2. JAVA의 자료형]

1. 기본형(Primitive Type)

- 논리형: Boolean

- 숫자형: byte, char, short, int, long, float, double

- 실제 값을 저장한다

- NULL을 받을 수 없다!

 

2. 참조형(Reference Type)

- 객체의 주소를 저장하는 공간. 포인터 느낌.

- 클래스, 인터페이스, 배열, 문자열 등...

- java.lang.Object를 상속받는다.

- NULL을 받을 수 있다

 

byte char short int long float double boolean
1byte 2byte 2byte 4byte 8byte 4byte 8byte 1byte

 

* 문자열은 String 클래스, 참조형이다.

* char는 2byte 정수형이다 - 실제로는 정수가 저장되어 있으나, 출력 시 문자로 매핑해서 보여주는 것.

* 매우 긴 숫자, 소숫점을 표현하기 위해서는 BigDecimal을 사용해볼 수 있다. (참조 타입)

 

* 1bit: 메모리의 최소 기억 단위

* 1byte(=8bit): 자바의 최소 접근 단위

* JVM은 연산 시 32bit 단위(int 단위)로 계산한다.

byte a = 1;
byte b = 2;
byte c = a + b; // ERROR
byte d = (byte)(a + b); // OK

따라서 위와같은 코드는 에러를 뿜는다. 

byte a + byte b 연산을 할 시 1byte가 아니라 4byte짜리가 만들어지는 것이다.

 

따라서, (byte)로 다시 형변환을 해줄 필요가 있다.

 

[형변환]

- 큰 범위에서 작은 범위로의 변환은 데이터 손실을 유발할 수 있다.

- 값의 범위가 작은 타입에서 큰 타입으로의 형 변환은 생략할 수 있다.

- 기본형 변수는 참조형 변수로 형변환 될 수 없다. 기본형은 기본형끼리만 변환.

- 참조형 변수는 자신의 하위 클래스 객체로만 형변환 할 수 있다.

 

+) 기본형 타입의 데이터를 참조형 타입의 데이터로 만들기 위해서는 "포장 과정"(Boxing)이 필요하다

- Wrapper Class를 이용, 기본형을 감싸서 참조형으로 만든다. (형변환과는 다르다)

- int -> Integer, double -> Double 등...

- 참조형 타입의 데이터를 기본형 타입의 데이터로 돌려놓는 것을 언박싱(UnBoxing)이라고 한다.

 

+) 다형성(Polymorphism)에서의 형변환

1. 조상클래스 타입의 참조변수로 자손클래스의 인스턴스를 참조할 수 있다.

- 이 경우, 둘다 같은 타입의 인스턴스이지만 참조변수의 타입에 따라 사용할 수 있는 멤버의 개수가 달라진다.

 

2. 반면에 자손타입의 참조변수로 조상타입의 인스턴스를 참조할 수는 없다.

- 참조변수가 사용할 수 있는 멤버의 개수는 인스턴스 멤버 개수보다 작거나 같아야 한다.

- 자손타입의 참조변수로 조상타입의 인스턴스를 참조할 경우, 존재하지 않는 멤버를 사용할 가능성이 있으므로 허용하지 않는다.

(조상 인스턴스의 멤버 개수는 자손 인스턴스의 멤버 개수보다 항상 작거나 같다)

 

3. 자손타입 -> 조상타입은 형변환 생략 가능하다 / 조상타입 -> 자손타입은 형변환 생략 불가능하다

- 자손타입 -> 조상타입의 경우는, 사용할 수 있는 멤버의 개수를 줄이는 방향이므로, 문제가 되지 않는다.

- 조상타입 -> 자손타입의 경우는 반면 사용할 수 있는 멤버의 개수를 늘이는 것으로 문제가 발생할 가능성이 있다.

 

4. 참조변수가 가리키는 인스턴스의 자손타입으로의 형변환은 허용되지 않는다.

 

5. 형변환은 참조변수의 타입을 변환하는 것이지 인스턴스를 변환하는 것이 아니다. 따라서 참조변수의 형변환은 인스턴스에 아무런 영향을 미치지 않는다. 단지 참조변수의 형변환을 통해서 참조하고 있는 인스턴스에서 사용할 수 있는 멤버의 범위를 조절하는 것 뿐.

 

 

[상수]

상수를 만들기 위해서는 변수의 타입 앞에 'final' 만 붙여주면 된다

- 선언과 동시에 초기화 해야 하며, 그 이후부터는 값을 변경할 수 없다.

- 기본형, 참조형 타입 변수 모두 상수가 될 수 있다. (클래스나 인스턴스 모두)

 

* 값을 변경할 수 없다는 의미는 참조변수가 담고있는 주소값이 변하지 않는다는 의미이다. 

- 상수 참조변수가 가리키는 인스턴스의 내부 데이터는 변경 가능하다.

 

[리터럴]

JAVA에서 '상수'란 값을 한번 설정하면 변하지 않는 값(final)으로 정의했다. 때문에 일상적으로 정수, 문자 등을 표현하는 '상수'라는 뜻과 중복된다.

따라서 '자체로 값을 의미하는 것' 이라는 의미로 리터럴(Literal)이라고 정의한다. 그냥 데이터 값을 지칭하는 것이다. 

(여기서 데이터 값은 불변, 변하지 않는 값을 의미한다.)

 

- 특별히 'ㄱ'와 같이 작은따옴표로 문자 하나를 감싼 것을 '문자 리터럴' / "ㄱㄴㄷ"와 같이 두 문자 이상을 큰 따옴표로 감싼 것을 "문자열 리터럴"이라고 부른다.

- 조금 더 자세히 알아보자면 String 클래스는 불변(Immutable) 클래스이기 때문에 한번 객체를 생성하면 내부 데이터가 변하지 않는다. 따라서 문자열도 "리터럴"이라고 부를 수 있는 것이다.

 

 

[#3. 자바의 제한자]

 

자바의 접근 제한자는 총 4종류이다. public, protected, private, default

이외의 제한자(Modifier)는 자주 보이는것들은 static, final, abstract, synchronized 정도가 있다.

(static, final 이 부류도 제한자라고 부르는지는 명확치 않다.. 일반적으로 그냥 "예약어" 정도로 퉁치는듯)

 

** 왜 접근 제한자를 사용하는가?

1. 외부로부터 데이터를 보호하기 위하여

2. 외부에는 불필요한, 내부적으로만 사용되는 부분을 감추기 위해서 

=> 데이터 감추기, 캡슐화!

 

<접근 제한자(Access Modifier)>

(좁다) private -> default -> protected -> public (넓다)

 

1. public

- 패키지, 클래스가 동일하지 않아도 모든 접근이 가능하다

- 모든 접근이 가능하니까 공용 -> public

 

2. protected

- 같은 패키지 내에서만 접근을 허용한다

- 다른 패키지에서 접근하기 위해서는 해당 클래스를 상속받은 경우에만 가능하다

  (다른 패키지에서는 자식 클래스만 접근할 수 있다는 뜻)

 

3. default

- 같은 패키지 내에서만 접근을 허용한다

- 접근 제한자 생락시 기본값

 

4. private

- 같은 클래스 내에서만 접근을 허용한다

- 싱글톤 패턴을 사용하기 위해 주로 사용

-> 생성자를 private로 막아 외부에서 new로 새 객체를 생성할 수 없도록 막는다

- 생성자가 private인 경우, 다른 클래스의 조상 클래스가 될 수 없다. (자손 클래스에서 조상 클래스를 생성할 수 없기 때문)

 

 

** 싱글톤 패턴이란)

class Singleton {
   // private 제한자는 같은 클래스 내부에서는 접근이 가능하다.
   private static Singleton s = new Singleton();
   
   // 생성자가 private 이므로, 외부에서 인스턴스를 생성할 수 없다.
   private Singleton() {...}
   
   // 인스턴스를 생성하지 않고도 호출할 수 있어야 하므로, static 메서드여야 한다.
   // Getter 같은 역할.
   public static Singleton getInstance() {
       return s
   }
}

 

* 클래스에 붙는 접근 제한자 - public, default

* 생성자에 붙는 접근 제한자 - public, protected, default, private

* 메소드에 붙는 접근 제한자 - public, protected, default, private

* 지역변수는 접근 제한자를 사용할 수 없다

 

 

<제한자(Modifier), 예약어>

1. static

- 클래스 레벨에 붙는 변수.

- 여러 클래스가 공유하며, 딱 하나만 존재한다.

- 클래스 로딩 시점(인스턴스 생성 이전)에 생성되어, 하나의 객체를 공유해서 사용하는 개념.

- (클래스 로딩 시, Method Area에 저장 - 모든 스레드가 공유해서 사용)

- 메서드 내에서 인스턴스 멤버를 사용하는가 여부에 따라 static 결정.

- 멤버변수, 메서드, 초기화 블럭에 붙을 수 있다.

 

2. final

- 불변 객체.

- 생성 시에 딱 한번 값을 할당하고 이후에는 수정할 수 없다.

- final이 붙은 메서드는 오버리이딩을 통해 재정의할 수 없다.

- final이 붙은 클래스는 다른 클래스의 조상이 될 수 없다.

 

3. abstract

- 추상 클래스/메서드임을 나타낸다.

- 추상 클래스는 아직 완성되지 않은 메서드가 존재하는 미완성 클래스이므로, 인스턴스를 생성할 수 없다.

 

 

** 제한자들의 조합

1. 메서드에 abstract와 static을 같이 사용할 수 없다.

- static 메서드는 몸통이 있는 메서드에만 사용이 가능하다

 

2. 클래스에 abstract와 final을 같이 사용할 수 없다.

- abstract는 상속을 통해 오버라이딩 하라는 의미인 반면, final은 더이상 클래스를 확장할 수 없다는 의미이므로, 서로 상충된다

 

3. abstract 메서드의 접근 제한자가 private일 수 없다.

- abstract 메서드는 자식 클래스에서 구현해야 하는데 private인 경우는 접근할 수 없기 때문.

 

4. 메서드에 private와 final을 같이 사용할 필요 없다.

- private인 메서드 역시 오버라이딩이 불가능 하므로 굳이 final을 안써도 된다.

 

 

* 모든 클래스에서 공유하는 상수를 만들기 위해 대개 "static final int CONST" 형식으로 많이 사용한다.

(상수명은 모두 대문자로 하는 것이 관례)

 

* public static void main() 의 의미

1. public

- main 메소드는 어디에서나 접근이 가능해야한다

 

2. static

- main 메소드는 자바 프로그램의 진입점을 담당한다. 이말인 즉슨 메모리에 미리 올라와있어야 한다는 뜻.

- 따라서 클래스 로딩 시 Method Area에 미리 올려두기 위해 static 제한자를 반드시 걸어두어야 한다.

+) static은 method area에 저장되기 때문에 GC의 관리대상이 아니다. 

- 프로그램 종료시까지 main 메소드를 유지시키기 위해 static 필요.

 

3. void

main 메소드는 시작과 끝을 함께한다.

main 메소드의 끝은 프로그램의 끝을 의미하는데 return해서 뭘 던져줄 필요 자체가 없다.

 

<정적 변수, 정적 메소드는 어떤 상황에서 쓰는가?>

= "새로 생성한 객체(인스턴스)가 없어도 이를 사용할 필요가 있는가?"

static 변수, 메소드는 로딩 시에 메모리에 미리 올라감으로, 객체를 new로 생성하기 이전이라도 사용할 수 있다.

- 정적 메소드는 프로그램 시작부터 끝까지 메모리에 계속 상주한다. 장단이 있는 것.

 

[정적 변수]

- 클래스명.정적 변수명으로 접근해서 사용

- 보통 상수(static final)을 만들거나, 프로그램 전체에서 공유해서 사용하기 위해 정적 변수를 사용한다.

 

[정적 메소드]

> main 메소드와 같이 인스턴스 없이도 사용할 수 있어야 하는 경우.

> 유틸리티 함수를 만드는 경우 (java.lang.Math 패키지 등..)

---> Math.min() 혹은 Math.max() 등을 사용할 때 새로운 객체를 생성할 필요 없이 바로 메소드에 접근할 수 있는 것은 바로 정적 메소드이기 때문.

 

* 정적 메소드는 인스턴스 변수를 사용할 수 없다.

* 정적 메소드는 정적 메소드만 호출할 수 있다

- 일반 메소드는 new로 인스턴스를 생성한 다음에야 사용할 수 있다.

 

아래의 내용은 <자바의 정석>에 나와있는 static 메서드와 인스턴스 메서드의 관계를 설명하는 내용이다.

---

클래스는 데이터(변수)와 데이터에 관련된 메서드의 집합이므로, 같은 클래스 내에 있는 메서드와 변수는 아주 밀접한 관계를 맺고있다. 

인스턴스 메서드는 인스턴스 변수를 필요로 하는 메서드이다. 그런데 인스턴스 변수는 인스턴스(객체)를 생성해야 만들어지므로, 인스턴스 메서드 역시 인스턴스를 생성해야만 호출할 수 있다.

 

**

클래스 변수 - 클래스가 메모리에 올라갈 때 생성

인스턴스 변수 - 인스턴스가 생성될 때 생성

지역변수 - 변수 선언문이 수행될 때 생성

**

 

"인스턴스 멤버가 존재하는 시점에 클래스 멤버는 항상 존재하지만, 클래스 멤버가 존재하는 시점에 인스턴스 멤버는 존재하지 않을 수 있다"

 

메서드 중에서 인스턴스와 관계없는(인스턴스 변수나 메서드를 사용하지 않는) 메서드를 static 메서드로 정의한다.

1. 멤버변수 중 모든 인스턴스에 공통으로 사용하는 것에는 static을 붙인다

2. static 변수는 인스턴스를 생성하지 않아도 사용할 수 있다.

- static 변수는 클래스가 메모리에 올라갈 때 자동적으로 생성되기 때문이다.

3. ststic 메서드는 인스턴스 변수를 사용할 수 없다

- static 메서드는 인스턴스 생성 없이 호출 가능하므로, static 메서드가 호출되었을 때 인스턴스가 존재하지 않을 수도 있다. 따라서 사용할 수 없다

- 반대로 인스턴스에서는 static 메서드를 자유롭게 사용할 수 있다

4. 메서드 내에서 인스턴스 변수를 사용하지 않는다면, static을 붙이는 것을 고려한다.

- static이 붙으면 메서드 호출시간이 빨라져 성능이 향상된다.

---

[#4. 추상 메소드와 추상 클래스]

추상 메소드(Abstract Method): 자식 클래스에서 반드시 오버라이딩해야만 사용할 수 있는 메소드

- 추상 메소드가 포함된 클래스를 상속받는 자식 클래스가 반드시 추상 메소드를 구현하도록 강제하기 위함.

- 추상 메소드는 선언부만 존재하며, 구현부는 작성되어있지 않다.

 

추상 클래스(Abstract Class): 추상 메소드를 하나 이상 포함하고 있는 클래스.

- 추상 메소드를 포함하고 있으므로 인스턴스를 곧바로 생성할 수 없다.

(추상 클래스를 상속받고 구현한 자식 클래스는 인스턴스를 생성할 수 있다.)

 

결론: 자식 클래스가 특정 메소드를 반드시 구현하게끔 강제하기 위해 사용한다.

 

* 익명 클래스(Anonymous Class) - 한번 쓰고 버릴 용도로 만드는 클래스

 

 

[#5. 기타]

프로그래밍: 수식이나 작업을 컴퓨터에 알맞도록 정리해서 순서를 정하고 컴퓨터 특유의 명령코드로 고쳐쓰는 작업.

코딩: 컴퓨터의 명령 코드를 쓰는 작업

소스: 프로그래밍 언어로 작성된 내용

 

<구조적 프로그래밍>

- 단계적 해결, 제어구조가 명확

- 함수로 구성

- 기능 단위의 프로그램 설계

- C, Cobol, Basic 

 

<객체지향 프로그래밍>

- 객체라는 단위로 모든 처리를 기술하는 프로그래밍 방법. 

- 클래스로 구성

- 객체 중심의 프로그램 설계

- C++, JAVA

 

<변수의 유형>

1. 인스턴스 변수 - 자바 객체의 개별적인 값을 저장하는데 사용되는 변수

2. 클래스 변수 - static 제한자를 가진 멤버 변수. '클래스 이름.변수 이름' 형태로 접근

3. 지역 변수 - 메서드 안에 선언하는 변수. 해당 메서드 안에서만 사용가능

4. 파라미터 - 메서드의 인자로 전달되는 변수

 

<연산자 우선순위>

 

1. 1차 연산자(괄호) (), []
2. 단항 연산자 ++, --, ~, !
3. 산술 연산자 *, /, %
4. 산술 연산자 2 +, -
5. 비트 시프트 연산자 <<. >>
6. 비교 연산자 <, <=. >, >=
7. 관계 연산자 ==, !=
8. 비트 연산자 &
9. 비트 연산자 ^
10. 비트 연산자 |
11. 논리 연산자 &&
12. 논리 연산자 ||
13. 조건 삼항 연산자 ?
14. 대입 연산자 =, +=, /=, *=, -= 등

 

* 동일한 우선순위의 연산자는 연산방향이 존재한다

- 단항 연산자, 대입 연산자, 부호 연산자는 오른쪽에서 왼쪽 방향으로 연산한다

 

<자료구조>

자료구조란, 컴퓨터 프로그램에서 사용되는 자료를 효율적으로 이용할 수 있도록 데이터들 사이에 구성된 논리적 관계로 컴퓨터에 저장되는 방법을 뜻한다.

외형에 따라 단순 구조, 선형 구조, 비선형 구조, 파일 구조로 나뉜다.

 

Java는 기본적인 자료구조를 제공하기 위해 Java Collection Framework를 제공한다.

- Collection->(List->(LinkedList, Stack, Vector, ArrayList), Set->(HashSet, SortedSet))

- Map->(Hashtable, HashMap, SortedMap)

 

[클래스 관련]

- 인스턴스는 참조변수를 통해서만 다룰 수 있으며, 참조변수의 타입은 인스턴스의 타입과 일치해야 한다.

- 클래스는 데이터와 함수의 결합으로, 속성(멤버 변수)과 기능(메서드)으로 정의되어있다. 

- 인스턴스 변수는 인스턴스가 생성될 때 마다 생성되므로 인스턴스마다 각기 다른 값을 가질 수 있다.

- 클래스 변수는 모든 인스턴스가 하나의 저장공간을 공유하므로 항상 공통된 값을 갖는다.

 

[오버로딩] 

오버로딩이란, 한 클래스 내에 같은 이름의 메서드를 여러개 정의하는 것을 뜻한다. (오버라이딩과 다르다!!)

 

<조건>

1. 메서드 이름이 똑같아야 한다

2. 매개변수의 개수 혹은 타입이 달라야 한다. (반환 타입은 오버로딩에 아무런 영향이 없다)

 

 

[클래스 간 포함관계와 상속관계]

- 자손 클래스의 인스턴스를 생성하면 조상 클래스의 멤버와 자손 클래스의 멤버가 합쳐진 하나의 인스턴스로 생성된다

- "~은 ~이다" 라는 문장이 성립하면, 상속관계가 적합하다

- "~은 ~을 가지고 있다"라는 문장이 성립하면, 포함관계가 적합하다.

 

- JAVA에서는 단일상속만을 허용한다. (하나 이상의 클래스로부터 상속을 받을 수 없다)

왜?)

1. 서로다른 클래스로부터 상속받은 멤버간의 이름이 같은 경우 구별할 수 있는 방법이 없다!

2. 클래스 간의 관계 역시 복잡해진다. 

 

 

[오버라이딩]

오버라이딩은 조상에게 상속받은 메서드의 내용을 새로 작성하는 것으로, 메서드의 선언부는 조상의 것과 완전히 일치해야 한다.

 

<제한 조건>

1. 접근 제어자는 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다

(좁다 private -> default -> protected -> public 넓다)

 

2. 조상 클래스의 메서드보다 더 많은 수의 예외를 선언할 수 없다

- throws Exception 의 경우, 모든 예외의 조상이므로, 가장 많은 수의 예외를 던진다.!

 

3. 인스턴스 메서드를 static 메서드로, 또는 그 반대로 변경할 수 없다.

 

 

[static import문]

static import문을 사용하면 static 멤버를 호출할 때 클래스 이름을 생략할 수 있다.

- 특정 클래스의 static 멤버를 자주 사용할 때 편리.

대표적으로 이런거

---------------

 

* 하나의 Java 애플리케이션에는 main 메서드를 포함한 클래스가 반드시 하나는 존재해야한다.

- main 메서드는 Java 애플리케이션의 시작점이므로 main 메서드 없이는 실행될 수 없다.

 

* 하나의 소스파일에 둘 이상의 public class는 존재할 수 없다.

- public이 아닌 (default) class는 여러 개 존재할 수 있다. 

 

* 변수 = 단 하나의 값을 저장할 수 있는 메모리 공간.

 

* 자바는 실수형을 저장할때 부동소수점 방식으로 저장한다. 자세히 알아보면 머리아프고 그냥 실수는 double 사용하는걸로 고정하자. (double의 정밀도는 최대 15자리 (=소수점 아래 14자리))

 

* 메서드의 반환타입이 '참조형'이라는 것은, 메서드가 객체의 주소를 반환한다는 의미이다.

 

* 멤버변수(static 변수 및 인스턴스 변수)와 배열의 초기화는 선택적이지만, 지역변수의 초기화는 필수적이다.

 

* this

- 인스턴스 자신을 가리키는 참조변수. 인스턴스의 주소가 저장되어있다.

- 모든 인스턴스 메서드에 지역변수로 숨겨진 채 존재한다.

 

* super

- 자손 클래스에서 조상 클래스로부터 상속받은 멤버를 참조하는데 사용되는 참조변수.

- 상속받은 멤버와 자신의 클래스에 정의된 멤버의 이름이 같을 때 super를 붙여 구별할 수 있다.

- 조상의 멤버와 자신의 멤버를 구별하는데 사용된다는 점 빼고는 "this"와 동일하다.

 

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
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
글 보관함