Java TPC Part-1

박철현·2023년 10월 7일

Java

목록 보기
5/13

Java 구동 방식

  • 운영체제 JDK 설치 -> 운영체제 메모리 위 JVM(가상 머신 메모리 탑제)

    • 실행 명령어 왔을 때 동작(시스템 콜)
      • javac : 컴파일 명령어
      • java : 실행 명령어
  • 1차 컴파일 된 byte 코드 -> JVM이 OS에 맞게 실행 가능한 코드로 만들어 실행

    • byte 코드 형태의 실행 가능한 class 파일 생성
    • JVM이 OS에 맞게 실행 가능한 코드로 만들어서 실행
  • 운영체제에 상관 없이 독립적으로 구동할 수 있다 : JVM에 의함

    • 가상 머신에 의해 실행하기에 속도가 느릴 수도 있다.
    • Virtual Machine이 돌아가야 실행할 수 있기 때문에 JRE라는 실행 환경을 설치해야 함

프로그래밍의 3대 요소

  • 변수 / 자료형(DataType)/ 할당(=)
    • 변수 : 데이터를 저장할 메모리 공간의 이름
    • 자료형 : 변수의 크기와 데이터의 종류를 결정해 둔 것
      • 기본 자료형
        - 정수 : short, int, long (종류) / 2, 4byte, 8 (크기)
        - 실수 : float, double / 4, 8
        - 문자 : char / 2
        - 불 : boolean / 1
        ex) int(자료형) a(변수); => 변수 선언
      • 사용자 정의 자료형 : 객체 자료형
        • 필요에 의해 새롭게 만들어 사용하는 자료형
        • 객체지향 프로그래밍(객체를 만들어서 프로그래밍)
        • 책 : BookDTO, ..
      • java에서 기본적으로 소수는 double형, float형으로 사용하려면 소수 뒤에f를 붙여주면 float형 인식
        float f;
        f = 34.5f;
    • 변수 목록표 : 변수가 기억공간을 할당 받으면 변수의 번지가 등록되는 테이블
      int a = 10;
      float b = 34.5f;
      • 변수 목록표(Symbol Table)에 변수이름과 주소 저장

        • 변수가 기억공간을 할당 받으면 변수의 번지가 등록되는 테이블

        • ST에 변수가 없으면 can not find symbol 에러

          변수이름(key)번지(value)
          a100번지
          b200번지
      • 변수 목록표는 JVM 내 실행됨

관계를 이해하라(V.D.A)

  • 사용자 정의 자료형(User Define DataType) : 객체 자료형
    • 필요에 의해 새로 만들어 사용하는 자료형
    • DTO(Data Transfer Object) / VO(Value Object)라 하기도 하여 클래스명 뒤에 붙이기도 함
      • BookDTO, BookVO

데이터를 이동하라(변수 vs 배열의 관계)

  • 배열 : 동일한 타입의 데이터를 여러개 저장하기 위한 연속적인 메모리 구조
    • 서로 다른 타입을 저장하기 위해서는 class 필요
  • 2차원 배열
    • 가변길이 배열 저장 가능

      • a라는 변수에 행의 정보만 담고있기에 각 행에는 서로 다른 크기의 배열 가르키게 가능
      		int[][] a  = new int[3][];
      			a[0] = new int[3];
      			a[1] = new int[4];
      			a[2] = new int[5];

메서드는 변수다

  • 변수 : 데이터를 한개(한개의 형태)만 저장 가능
  • 메서드 : 동작 후 데이터를 한개만 만들어 낸다.
  • 변수와 메서드는 결론적으로 데이터를 한개만 저장하므로 비슷하다.
// 정의부
public int sum(int a, int b) 
// 구현부
{
	return a + b;
 }

JVM의 메모리 모델

  • 4가지 영역을 모두 사용하거나 일부만 사용하며 프로그램 동작

    • method Area : 메소드의 byte code 저장 영역
    • stack Area : 메서드의 호출 정보가 저장
      • Call Stack Frame Area 라고도 함
    • heap Area : 객체가 생성되는 영역(new 연산자)
    • literal Pool : 문자열(객체)상수가 저장되는 영역
  • main 메서드의 경우 JVM에서 가장 먼저 실행하므로, 항상 static을 붙여줘야 함(그래야 메모리에서 읽을 수 있음)

    public class TPC08 {
    	public static void main(String[] args){
       	int a = 10, int b = 20;
           int v = add(a, b);
           System.out.println(v);
       }
       public static int add(int a, int b) {
       	int sum = a + b;
           return sum;
       }
     }
  • static 메서드를 호출할 때 과정

    1. 해당 클래스를 현재 디렉토리에서 찾는다.
    2. 찾으면 클래스 내부에 있는 static 키워드가 있는 메서드를 메모리로 로딩한다.
    • method Area의 static zone에 로딩(main(), add() 메서드)
    1. static zone에서 main()메서드를 실행한다(호출, 시작)
    • main() method가 호출되면 호출 정보가 Stack Area에 들어감(push)
    • 프로그램이 시작되는 부분(PC의 위치가 현재 동작되고 있는 메서드)
    1. Stack Area가 비어있으면 프로그램 종료

 public class TPC09 {
 	public static void main(String[] args){
    	int a = 10, int b = 20;
        TPC09 tpc = new TPC09();
        int v = tpc.add(a, b);
        System.out.println(v);
    }
    public int add(int a, int b) {
    	int sum = a + b;
        return sum;
    }
  }
  • static이 없는 메서드를 호출할 때 과정

    1. 해당 클래스를 현재 디렉토리에서 찾는다.
    2. 찾으면 클래스 내부에 있는 static 키워드가 있는 메서드를 메모리로 로딩한다.
    • method Area의 static zone에 로딩(main() 메서드)
    1. static zone에서 main()메서드를 실행한다(호출, 시작)
    • main() method가 호출되면 호출 정보가 Stack Area에 들어감(push)
    • 프로그램이 시작되는 부분(PC의 위치가 현재 동작되고 있는 메서드)
    1. Stack Area가 비어있으면 프로그램 종료

  • static 메서드 내에서 static이 아닌 객체의 메서드를 사용하기 위해서는 객체를 생성해줘야 하거나, 이미 생성된 상태여야 함

기본자료형(PDT) vs 사용자정의자료형(UDDT)

  • 객체 생성 : 메모리에 기억공간 실제로 만들기(heap Area)
    • "new 생성자메서드"
    • 객체를 설계하면 생성자 함수 기본적으로 생략되어 있음(기본 생성자)
      • 클래스 이름과 메서드 이름이 같고 리턴타입이 없음
    • this라는 자기 자신을 가르키는 객체변수도 생성됨
    public class BookDTO {
    	public String title;
      public int price;
      public String company;
      public int page;
      // 디폴트 생성자 메서드(생략)
        public BookDTO() {
        	//객체를 생성하는 작업(기계어 코드)
        }
    }

객체가 메모리에 어떻게 만들어지나

  • 객체 : 상태정보(변수), 행위정보(동작)
    • 모델링 : 가진 상태 정보를 나열하고, 필요한 속성으로만 구성하는 것
      • ex) 책 : 제목, 출판사, 저자, 가격, 페이지 수, ISBN, ...
    • 접근, 참조 연산자(".") : public만 접근 가능
      • 객체의 상태정보에 직접 접근하면 잘못된 데이터가 저장될 수 있다.
      • 정보은닉 필요
  • 생성자 메서드 : 객체 생성 후 객체의 초기화 역할
    • 생성자가 없을 때 기본 생성자가 만들어 짐(초기화 작업 x)
    • public 접근 권한을 가짐(private 생성자도 있음)
  • 생성자 중복정의(Overloading)
    • 매개변수의 개수나 타입을 다르게 해서 생성자를 여러개 만들 수 있음
      ```java
    public class BookDTO {
    	private String title;
      private int price;
      private String company;
      private int page;
      // 디폴트 생성자 메서드(생략)
      // 밑에 생성자를 만들어줬기 때문에 디폴트 생성자는 자동으로 만들어지지 않음
      // 명시적으로 만들어 줘도 사용할 수도 있음
        public BookDTO() {
        	//객체를 생성하는 작업(기계어 코드)
        }
        
        // 생성자 오버로딩(매개변수 타입이나 수가 다름)
        public BookDTO(String title, int price, String company, int page) {
        this.title = title;
        this.price = price;
        this.company = company;
        this.page = page;
    }

private 생성자도 있어요?

  • private 생성자를 가지면 객체를 생성할 수 없음

    • 외부 호출이 불가능 하기에
    • 객체를 생성하지 않고도 사용가능 해야 된다.
      • 모든 클래스의 멤버가 static 멤버가 되어야 한다.(100%)
      • static은 자동으로 메모리 로딩
      • 클래스 메서드 : 객체 생성 없이 접근 가능
        ex) Inflearn.java();
    public class Inflearn {
    	// 모든 멤버가 static 멤버이면 인위적으로 private 생성자로 만들어 객체 생성을 막을 수도 있다.
      private Inflearn() {
      
      }
      
      // 인스턴스 메서드 : 객체를 생성해야 사용 가능
      // 생성자 메서드가 private이기에 호출할 방법이 없음
      public void tpc() {
      	System.out.println("TPC강의 너무 재미있다.");
       }
       
       // 클래스 메서드 : 객체 생성하지 않아도 가능
       // method Area의 static-zone에 올라가 있음
       // Inflearn.java(); 로 호출 가능
       public static void java() {
       	System.out.println("Java강의 너무 재미있다.");
       }
     } 
  • static과 일반 메서드가 같이 있다면, public 생성자를 두고,
    static 메서드만 사용할 때는 객체를 생성할 필요가 없음.

    • 만일 일반 메서드를 사용하려면 객체를 생성해서 사용하면 됨
  • Java API에서 생성자가 private인 클래스 있음

    • System, Math, ...
    • System sys = new System(); (x)
  • static 멤버 접근 방법 : 클래스이름.메서드(static 메서드)

    • 자주 사용하는 객체나 동작은 static 멤버로 만들기도 함

애매하다! class, object, instance 상호관계

  • 현실세계의 객체(ex. 책)
  • class : 현실 세계의 객체 모델링(설계도)
  • object : 객체(변수), 구체적인 무언가 가르키기 전
    • ex) 책 b1, 책 b2, ...
  • instance : 객체가 메모리에 생성이 된 다음에 부르는 용어
    • 구체적인 무언가 가르키는 것
  • 객체를 생성하는 과정 보단 인스턴스를 만드는 과정이 좀 더 정확한 말일 수 있음
    • BookDTO b = new BookDTO();
public class BookDTO {
	public String title;
    public int price;
    public String company;
    public int page;
 }
 
 // 객체(변수) object, 구별이 되지 않음
 BookDTO b1;
 BookDTO b2;
 BookDTO b3;
 
 // 구체적인 객체를 가르키면 구별이 됨
 // 각각을 인스턴스(변수)라 부름(b1)
 // 객체가 생성이 된 다음에 구체적인 인스턴스를 가르키면 인스턴스변수라 부름
 b1 = new BookDTO();
  • class로만든 새로운 자료형 = 바구니 = 이동
    • DTO : Data Transfer Object
    • VO : Value Object

잘 설계된 클래스

  • 객체의 상태정보를 보호해야 함
    • 외부에서 마음대로 접근해서 기억공간에 넣고 빼고할 시 문제가 될 수 있음
      • ex) 나이 속성 -> if문으로 age<1 && age > 1000) 이런식으로 잘못된 데이터를 입력했을 때 별도 처리를 할 수 있음
    • 외부에서 자유롭게 접근하게 막기 필요
  • 정보은닉 : 다른 객체로부터 접근을 막는 것(private)
    • 직접 접근을 열지 않고 getter/setter 활용
    • 객체를 생성하면 getter/setter 메서드까지 메모리에 올라감
  • 잘 설계된 클래스
    • 1 ~ 4 구현된 것을 일반적으로 잘 설계한 것
public class MemberVO {
// 1. private로 객체의 상태 보호
	private String name;
    private int age;
    // 2. 디폴트 생성자를 명시적으로 만듦
    // 기본 생성자가 있으면 자동으로 만들어 지지 않으니, 만들어 두는 것이 좋음
    public MemberVO() {  }
    // 오버로딩 생성자를 말들어 적절하게 초기화한다.
    // 초기화를 효율적으로 하기 위함
    public MemberVO(String name, int age) {
    	this.name = name;
        this.age = age;
    }
    // 3. setter와 getter
    public String getName() {
    	return name;
    }
    public void setName(String name) {
    // DI(Dependency Injection : 종속객체 주입)
    	this.name = name;
    }
    public int getAge() {
    	return age;
    }
    public void setAge(int age) {
    	this.age = age;
    }
    // 4. toString 정의
    // 디버깅 하기가 쉽다
    // toString 메서드는 생략할 수 있음
    // 만일 m1이라는 객체가 있다면, toString 메서드가 이미 정의되어 있기에 toString 메서드를 호출하지 않아도 알아서 호출해줌
    // System.out.println(m1)
   	@Override
    public String toString() {
    	return "MemberVO [name=" + name + ", age =" + age + "]";
    }
  }

메서드 오버로딩

  • 메서드 오버로딩 : 같은 이름의 메서드를 여러개 가지면서 매개변수의 유형과 개수가 다르도록 하는 기술
    • signature가 다르면 된다(signature : 매개변수의 타입, 개수)
  • 오버로딩 : 속도 떨어지는 원인이 되지 않음
    • 만일 hap이라는 메서드가 100개가 있다면, 매번 매개변수를 파악하고 적절한 메서드를 찾아서 실행해야 해서 느려지지 않을까?
    • 컴파일러는 내부적으로 이름을 바꿔버리기에 느려지지 않음
      • hap_int_int(int a, int b) 이런식으로 바꿈
      • hap_float_int(float a, int b)
  • 오버로딩 : 정적 바인딩(컴파일 시점에 호출될 메서드가 이미 결정되어 있는 바인딩) -> 속도와는 관계 없다.
public class OverLoad {
	public void hap(int a, int b){
    	System.out.prinln(a+b);
    }
    
    public void hap(float a, int b){
    	System.out.prinln(a+b);
    }
    
    public void hap(float a, float b){
    	System.out.prinln(a+b);
    }
}

동일한 구조 vs 이질적인 구조

  • 배열 vs 클래스
    • 공통점 : 데이터를 담는 바구니 / 객체
    • 배열 : 동일한 데이터 구조
    • 클래스 : 서로 다른(이질적인) 데이터 구조
    • 객체배열 : 동일한 객체타입으로 이루어진 데이터 구조
    MovieVO[] marr = new MovieVO[5];

학습정리

  • class
    • DataType 측면 : 새로운 자료형을 만드는(설계하는) 도구 = 모델링 도구
    • OOP(객체지향) 측면 : 객체의 상태정보와 행위정보를 추출하여 캡슐화 하는 도구
    • Model이라고도 부른다(역할이 정해지므로)
      • DTO : 데이터 이동하기 위해 데이터를 담는다
        • VO(Value Object) : 객체를 담아서 하나의 값(덩어리)로 취급하는 의미
      • DAO(Data Access Object) : 데이터를 처리하는 역할(비즈니스 로직), 데이터베이스와 CRUD 역할
      • Utility(Helper Object) : 도움을 줄 수 있는 기능을 제공하는 역할(날짜, 시간, 통화, 인코딩 등)
    • 앞으로 사용하게 될 class들 : API(Application Programming Interface)
      • Java에서 제공해주는 class들
        • String, System, Integer, ArrayList, Map 등
      • 만들어 사용하는 class들(DTO, DAO)
      • 위 2개가 아닌 다른 사람이 만들어서 제공해주는 class들
        • Gson(Json화 해줌), Jsoup, POI, iText 등
        • 검색을 해서 다운 -> MVNRepository 사이트에서 jar파일(클래스 여러개를 묶어서 만든 파일)
  • String, System은 빈번하게 사용되기 때문에 import java.lang.* 이 디폴트로 적용되어 있음
// 원래는 import문으로 포함 안되면 아래와 같이 적용해야 함
java.lang.String str = new java.lang.String("Apple");

마치며

  • 강의를 보며 거의 아는 내용이지만, JVM관련해서 heap, stack, method Area 등 좀 상세히 듣기는 처음이라 좋았던 것 같다.

  • 2만원을 주고 산 강의기에 배속, 넘겨가며 보고 있지만.. 그래도 다시 개념 잡고, 몇몇 자세하게 몰랐던 부분을 파악하기에 좋은 강의라 생각한다.

    • 글 정리해 뒀으니 나중에 상세하게 기억안나면 다시 보기에 좋을듯!
  • 자바 클래스, 배열 부분 관련해서 모르는 분들이 많이 보면 도움 될 것 같다.

  • 2부도 이런식으로 후딱 봐보려고한다! 득이되면 득이됐지, 실이되진 않겠지!

  • 출처 : 인프런 - Java TPC(생각하고, 표현하고, 코딩하고

  • 강의 출처남기면 블로그 작성해도 된다고 하셨지만, 상세 실습코드는 작성하지 않았습니다. 강의를 통해 확인하세요!

profile
비슷한 어려움을 겪는 누군가에게 도움이 되길

0개의 댓글