JAVA 5일차

Lucy in the Sky with Diamond·2023년 6월 8일
  • 목적 코드 : 각각의 CPU 양식에 맞는 기계어, 그러니까 인텔 CPU나 ArmCore CPU에 맞는 기계어가 각각 있다는 의미임

Scope

  • 프로그래밍 언어에서 scope(범위)의 의미는 변수와 함수의 유효범위를 의미함
  • 여기서 블록은 중괄호({}, Brace라고 부르기도 함 )를 의미함
  • scope는 변수의 유효범위를 지정함으로써 변수명 충돌 방지, 메모리의 사용을 보다 효율적으로 쓸 수 있다.
  1. Global Scope
    프로그램의 어디서든지 접근이 가능함(자바에서는 없음)
  2. Local Scope
    지역범위에 선언된 변수와 함수는 특정 블록 내에서만 접근 가능
  3. Parameter scope
    함수의 매개변수는 함수내에서 지역변수로 취급됨,함수내에서만 사용
  4. Block scope
    블록내에서 선언된 변수의 범위를 제한
  5. Class Scope
    클래스 내부에서 선언된 변수(=필드), 메소드가 유효한 범위를 의미함
    그리고 이러한 필드와 메소드들은 Access modifier(접근제어자)에 의해 어디에서 접근이 가능한지 결정이 된다.
public class Student {
    // 이들 변수들은 클래스 스코프를 가집니다.
    private String name; // private 접근 제어자는 이 필드를 같은 클래스 내에서만 접근할 수 있도록 합니다.
    private int age;
    private double grade;

    public Student(String name, int age, double grade) {
        // 생성자에서 클래스 스코프의 필드를 초기화합니다.
        this.name = name;
        this.age = age;
        this.grade = grade;
        //this가 의미하는것은 파라미터의 변수명(public Student(String name, int age, double grade))
        //생성자 내부의 필드명(= name;)이 같을때 구분짓기 위해 사용됨
    }

    // 각 필드에 대한 getter 메소드를 제공합니다.
    public String getName() {
        return this.name;
    }

    public int getAge() {
        return this.age;
    }

    public double getGrade() {
        return this.grade;
        
    }

    // 각 필드에 대한 setter 메소드를 제공합니다.
    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void setGrade(double grade) {
        this.grade = grade;
    }

    public void printStudentInfo() {
        // 이 메소드는 클래스 스코프의 필드에 접근합니다.
        System.out.println("Name: " + name + ", Age: " + age + ", Grade: " + grade);
    }
}
  • Student 내에서 name,age,grade라는 필드는 클래스 스코프이며(private이니까 애초에 클래스 내에서만 정의됨) constructor에서 클래스 스코프의 필드가 초기화됨

Call by value VS Call by reference

  • 자바에서 메소드 호출시 아규먼트가 파라미터로 전달하는 방법에는 Call by value가 있고 Call by reference가 존재함

Primitive data type : int, double, char , float

  • 기본형 타입은 스택에 저장됨
  • String xx = "hello"에서 String xx라는 변수 자체는 스택에 저장

Reference data type : 클래스, 인터페이스, 배열

  • 참조형 타입은 힙영역에 저장됨
  • "hello"부분이 힙영역에 저장됨

String Class

  • Literal = immutable

  • 자바의 String은 변경 할 수 없는 유니코드 문자의 시퀀스를 포함

    • length(): 문자열의 길이를 반환합니다.
    • isEmpty(): 문자열이 비어 있는지 여부를 확인합니다. (str.length() == 0 과 동일)
    • isBlank(): 문자열이 공백 문자(Unicode 공백)로만 이루어져 있는지 확인합니다. (JDK 11)
    • equals(String another): 두 문자열을 비교합니다. '=='나 '!='를 사용할 수 없습니다.
    • equalsIgnoreCase(String another): 대소문자를 무시하고 두 문자열을 비교합니다.
    • compareTo(String another): 두 문자열을 비교하여 동일하면 0을 반환하고, 사전적 순서에 따라 -1 또는 1을 반환합니다.
    • startsWith(String another): 문자열이 주어진 문자열로 시작하는지 여부를 확인합니다.
    • endsWith(String another): 문자열이 주어진 문자열로 끝나는지 여부를 확인합니다.
    • indexOf(String key): 주어진 문자열이 처음으로 나타나는 인덱스를 반환합니다.
    • charAt(int idx): 주어진 인덱스에 해당하는 문자를 반환합니다.
    • substring(int fromIdx): 주어진 인덱스부터 문자열의 끝까지의 부분 문자열을 반환합니다.
    • toLowerCase(): 문자열을 소문자로 변환하여 새로운 문자열을 반환합니다.
    • toUpperCase(): 문자열을 대문자로 변환하여 새로운 문자열을 반환합니다.
    • concat(String another): 두 문자열을 연결하여 새로운 문자열을 반환합니다.
    • trim(): 문자열의 앞뒤 공백을 제거한 새로운 문자열을 반환합니다.
String s1 = "Hello";              // String literal
String s2 = "Hello";              // String literal
String s3 = s1;                   // same reference
String s4 = new String("Hello");  // String object
String s5 = new String("Hello");  // String object

  • s1과 s2 s3는 string literal이기에 Immutable(값의 변화가 x)하다.
    그리고 String literal은 common pool(string constant pool이라고도 함)이라는 영역에 따로 저장된다.
  • 반면 s4와 s5는 새로운 객체를 아예 만들어 버리므로 s4와 s5는 각각 별개이다.
    그리고 new라는 객체를 새로 만들었기에 당연히 Heap영역에 떨어져 저장이 됨
  • 클래스 외부 = 패키지
    Class Access Modifier (public,private,protected)
    Package-private = default(public,private,protected이 아닌 엑세스 제한자가 없는 경우)
    (Interface에 default 키워드가 있는데 그거랑 헷갈리지 말자)

  • 패키지1 안에 클래스A 클래스B 클래스C가 존재하고
    패키지2 안에 클래스D 클래스E가 존재함
    여기서 클래스B,E 안에서 메소드나 필드가 A로부터 상속받은것(빨간 화살표)
    주황색은 접근이 가능하다는것을 의미(즉, C도 상속을 받으면 접근이 가능하다는 의미임)
    위의 그림을 머릿속에 반드시 암기하자!

자바 클래스 파일

  • 컴파일러는 소스코드를 타겟PC속 cpu의 기계어로 변환시켜주는 프로그램
  • 컴파일러는 일반적으로
    1. 소스코드를 읽고
    1. 코드를 분석하고
    2. 중간코드를 생성하고(미들엔드)
    3. 최종적으로 기계어코드를 생성

  • 자바 가상머신은 바이트코드를 인터프리팅하거나 JIT(Just In Time)컴파일러를 통해 기계어로 변환하여 실행

  • AOT 컴파일(Ahead-of-time compile) : 안드로이드 런타임

  • HotSpot JVM :

  • 바이트 코드는 기계어라 생각하면 됨


추상화

  • 자바에서 추상화를 실현시키기 위해 추상클래스와 인터페이스를 사용함
    여기서 추상클래스는 '상속' 인터페이스는 '구현'이다.
// 추상 클래스
abstract class Animal {
    String name;

    public Animal(String name) {
        this.name = name;
    }

    public abstract void sound(); // 추상 메서드

    public void eat() {
        System.out.println(name + "이(가) 먹는 중입니다.");
    }
}

// 인터페이스
interface Flyable {
    void fly(); // 추상 메서드
}

// 추상 클래스를 상속받고 추상 메서드를 구현한 구체 클래스
class Dog extends Animal {
    public Dog(String name) {
        super(name);
    }

    public void sound() {
        System.out.println(name + "이(가) 멍멍하고 짖습니다.");
    }
}

// 인터페이스를 구현한 클래스
class Bird implements Flyable {
    public void fly() {
        System.out.println("새가 날개를 펄럭이며 날아갑니다.");
    }
}
  • concrete class : 구체 클래스

인터페이스

  • 구현을 갖지 않는 추상 메소드
  • loose coupling

오브젝트 클래스

  • 자바의 모든 클래스는 오브젝트 클래스를 무조건 상속한다!!
  • java.lang.
  • final 키워드 : C언어에서 #define과 같음
  • native void notify( ) (JVM에서 구현한 C로 만들어진 함수(즉 notify())를 불러올때 사용)
  • Class 클래스 객체는 메타데이터(이게 어떤 데이터인지를 나타냄)
  • Hashcode( ): 이 매소드는 현재 객체의 해시코드를 반환(해시 알고리즘에 의해 키와 밸류(인덱스)가 만들어짐, 배열에서 검색을 빠르게 하기 위해 만들어짐)
  • 심볼 테이블 : 함수 정보를 가지고 있는 테이블
  • clone() : 클래스 복사

0개의 댓글