자료구조의 기초 1 - Java Onboarding

Nitroblue 1·2025년 9월 3일

자료구조

목록 보기
3/15

Java Onboarding

  • Java는 C++와 마찬가지로 Object Oriented Language이며, 플랫폼에 independent하다.
    • 즉, Write Once, Run Anywhere가 가능하다.
  • Java는 객체지향이므로 모든 것들이 객체화되어있다.
  • 만약 모든게 그저 클래스형태로 존재한다면 어디가 시작점인지 모를 거 아냐? 그래서 java program은 main method를 시작점이라고 정의하는 것 같다.
public static void main(String[] args) {
    }

int x = 5와
Integer x = new Integer(5)는
다르다.

윗줄은 단순히 int 원시자료형을 담은 변수일 뿐이지만 아랫줄은 int 원시 자료형을 object로 ‘Wrap’해준 명령어이므로 자바에서 기본적으로 제공하는 해당 객체 소속 기능들을 전부 사용할 수 있게 된다.


파일 디렉토리 계층 구조를 살펴보니
Project > src > package > class 순으로 이루어져 있다.

즉, 모든 소스코드들은 패키지 안에 각각 분류되어 있으며, 기능 구현 단위는 class로 하는 것 같다. 해당 class 안에는 다수의 함수들이 들어있다.

아마 파이썬에서 코딩테스트를 풀던 식으로 생각해보면, 기능 단위들을 전부 class 형태로 나누고, 해당 class 내에서 필요한 자잘한 함수들도 안에 넣어두되, 만약 다른 class들 간에도 자주 사용되는 함수라면 차라리 instance로 변환하여 사용한다.. 정도 될 것 같다.


Class

  • Member : 클래스 구성원
    • field : member variable
        int num1;
        static int num2;
    • method : member function
        public static int sum(int a, int b) {
        	return a + b;
        }
        
        public static void main(String[] args) {
        	int a = sum(5, 10);
            System.out.println("%d", a);
        }
  • Acces modifier : public, protected, default, private.

Call by value

class Updater {
	public void primitiveUpdate(int count) {
    	count++;

    public void objectUpdate(Counter counter) {
    	counter.count++;
    }
}

public class Counter {
	int count = 0;
    public static void main(String[] args) {
    	Counter myCounter = new Counter();
        Updater myUpdater = new Updater();
        myUpdater.primitiveUpdate(myCounter.count);
        myUpdater.objectUpdate(myCounter);
    }
}
  • 위 코드를 보면, 원시업데이트 함수는 argument로 원시 자료형을 패스해주고 있고, 객체업데이트 함수는 객체 자체(Reference Type : 참조형)를 인자로 받고 있다.
  • 결과적으로 원시자료형을 패스받은 함수는 원객체의 값을 변형시키지 못하지만, 객체 자체를 받은 함수는 값을 변형시킬 수 있다.

Main Class가 static으로 선언되는 이유?

  • Static은 '고정된'이라는 뜻을 가지고 있으며, 해당 클래스 자체에 귀속된다.
    따라서 이 static 성질을 가진 변수나 함수는 같은 클래스에서 만들어진 객체라 하더라도 접근하거나 수정할 수 없는 것이다.
  • 그럼 static의 특성에 대해 알아보자.
    - Static은 프로그램이 시작되면 메모리의 static 영역에 고정으로 적재되고, 프로그램이 종료될 때까지 bind되어 있다.
    • 객체 생성없이 사용할 수 있다.

생각해보면 그래야 할 것이, Main이라는 함수? 클래스? 는 프로그램 실행동안 한 번만 실행되어야 하는 존재이기 때문에 이 메인함수를 통해 static의 성질을 조금은 유추해볼 수 있지 않나.. 해서 갑자기 이렇게 적어봤다.

프로그래밍 언어라는 것도 결국 사람이 만들었고, 룰 역시 합리적으로 정해나가는 것이기 때문에 생각보다 언어라는 게 어려운 존재는 아닌 것 같다.


Data Types

  • 자바에는 8개의 basic type이 존재한다.
    • Boolean, Char, Byte, Short, Int, Long, Float, Double
  • 참조형은 1개만 존재한다.
    • C나 C++의 포인터처럼 변수들이 저장되어 있는 주솟값을 따로 저장하지 않는다.

Type Casting

  • Implicit/Automatic
    long m = 25;	// int 타입이 long타입으로 변형
    double d = 3.14 * 10;	// 10 -> 10.0 (?) 예시가 잘못된 것 같은데
  • Explicit
    	```
    double d = 1.9;
    int n = d; // error
    int n = (int)d; // correct

Final

  • C언어로 치면 immutable 타입이네.
    • final var : 상수
    • final methods : method overriding 방지
    • final classes : 상속 방지

System I/O

  • Input, Output Stream을 위해서 Java.util 패키지를 import해와야 한다!
Scanner scan = new Scanner(System.in);
String name = scan.next();
String city = scan.next();
...

진짜 모든게 패키지로 돌아가는구나. 완전 레고같다.

File In & Out

  • Scanner class를 활용하여 파일들을 읽어오거나 보낸다.
Scanner scanner = new Scanner();
while (scanner.hasNext()) {
	...
}
...

Array

반드시 선언된 다음에 접근해야 한다.
배열의 사이즈는 'length' field에 저장된다.

배열도 어쨌든 wrapped object라고 보면, field와 method가 존재할 것이며 어떤 배열 객체를 선언만 했다는 것은 생성된 시점에 굳이 배열의 크기를 적어두지 않았다는 것이다. 나중에 그 배열의 length나 원소들을 직접 넣어주었다면 그때 비로소 이 배열 객체의 field값이 업데이트되어 배열 역할을 할 수 있는 것이다.

이는 원시 참조형 객체가 아닌 내가 선언한 객체에 대해서도 동일하게 적용된다.
신기하다!!!

  • 배열 선언
int scores [];
int[] scores;
  • 배열 생성
scores = new int[4];
int[] scores = new int[4];
int[] scores = {100, 95, 87, 91};
  • Iteration 종류
for(int i = 0; i < members.length; i++

for(String name : members) {
	System.out.println(name);	// members라는 객체에 있는 값들 중 name이라는 것을 전부 프린트해주는 것. 
    // 아마 자동으로 해당 객체의 field 값 중에서 찾아내는 것 같다. method를 찾진 않겠지.
}

0개의 댓글