JAVA & JS 코드를 이해하기 위한 코드 공부 (+ Swift, Python)

팔랑이·2024년 12월 23일
0

CS

목록 보기
3/19
post-thumbnail

지금 듣는 CS 강의에서 JAVA, JS 코드를 위주로 설명해주는데 이해가 어려워서 써놓는 게시물

구성은

  • 지피티가 만들어준 Swift, Java, JavaScript, Python 비교 표
  • 그 밑에 따로 자잘자잘하게 공부한 내용들 추가예정

야매라 잘못된 내용 있음 알려주시면 감사드리겠습니다...


코드 비교

언어적 비교

특성SwiftJavaJavaScriptPython
타입 시스템정적 타입
강타입 (타입 안정성 보장)
타입 추론 지원
정적 타입
강타입 (타입 안정성 보장)
동적 타입
약타입 (유연성, 오류 위험)
동적 타입
강타입 (타입 안정성 있음)
메모리 관리자동 참조 카운팅 (ARC)
개발자가 직접 메모리 관리하지 않음
가비지 컬렉터(GC) 사용가비지 컬렉터(GC) 사용가비지 컬렉터(GC) 사용
실행 환경iOS/macOS/watchOS 앱 개발JVM 기반으로 플랫폼 독립적 실행
서버 및 안드로이드
브라우저 환경과 Node.js 기반 서버어디서나 실행 가능
머신러닝, 데이터 분석에서 두각
멀티스레딩Grand Central Dispatch(GCD)
async/await 지원
스레드와 Executor 사용이벤트 루프 기반 비동기 처리
Promise 활용
GIL(Global Interpreter Lock)로 제한적 멀티스레딩
패러다임객체지향(OOP) + 함수형 프로그래밍(FP)객체지향(OOP) 중심함수형 + 객체지향 + 절차적객체지향(OOP) + 절차적 + 함수형 프로그래밍
주요 사용 분야iOS/macOS 애플리케이션
모바일 개발
대규모 엔터프라이즈 애플리케이션
안드로이드 개발
웹 개발 (프론트엔드/백엔드)
SPA 개발
데이터 분석
머신러닝
웹 개발, 스크립트 처리

코드 구조/기능 단순비교

개념SwiftJavaJavaScriptPython
파일 구조import로 모듈 가져오기, 클래스/구조체 선언, 함수 및 메서드 정의package/import로 모듈 가져오기, 클래스 선언 필수, 클래스 내부에 메서드 작성import로 모듈 가져오기, 클래스/객체 사용 선택적, 함수/변수 중심으로 구성 가능import로 모듈 가져오기, 함수/클래스 정의, 스크립트 실행
Entry Pointmain() 함수(필요 시 정의, iOS에서는 AppDelegate/SceneDelegate 활용)public static void main(String[] args)특정 함수 호출(e.g., main() 또는 IIFE)코드 최상위 레벨에서 실행되며 main() 함수 정의 선택적
클래스 선언class MyClass {}class MyClass {}class MyClass {}class MyClass:
속성(Property)클래스/구조체 내부에 선언, 초기화 필요, 접근 제어(private/public)필드로 선언, 접근제어자(private/public/protected) 사용 가능클래스 내 정의, 기본적으로 public클래스 내 정의, 접근 제한 없음, 타입 선언 불필요
메서드(Method)func 키워드로 선언반환형과 접근제어자(public/private) 명시 필요function 키워드 사용 없이 정의 가능, 클래스 내 축약형으로도 사용 가능def 키워드 사용
생성자init() 메서드 사용클래스 이름과 동일한 메서드constructor() 메서드 사용__init__() 메서드 사용
변수 선언let(불변), var(변경 가능)타입 명시 필요(int, String 등), final로 불변 설정 가능let(불변), const(상수), var(변경 가능)타입 선언 불필요, 변수에 바로 값 할당
함수 선언func 함수명(param: Type) -> ReturnTypepublic ReturnType 함수명(ParamType param)function 함수명(param) {} 또는 const 함수명 = (param) => {}def 함수명(param):
조건문(If)if condition { } else { }if (condition) { } else { }if (condition) { } else { }if condition:
반복문(For)for item in items {}for (int i = 0; i < items.length; i++) {}for (let item of items) {} 또는 for (let i = 0; i < items.length; i++) {}for item in items:
접근제어자private, fileprivate, internal(기본), public, openprivate, protected, public, default(패키지 내 접근 가능)없음(ES6 이후 # 사용 시 private 가능)없음
에러 처리do-try-catch(Error 프로토콜 준수)try-catch-finallytry-catch-finallytry-except-finally
상속(Inheritance)class SubClass: SuperClass {}class SubClass extends SuperClass {}class SubClass extends SuperClass {}class SubClass(SuperClass):
인터페이스/프로토콜protocol ProtocolName {}interface InterfaceName {}class MyClass implements InterfaceName {}없음(메서드 오버라이드로 유사하게 구현 가능)
익명 함수/클로저let closure = { (param: Type) -> ReturnType in ... }익명 클래스와 람다(Java 8 이상): (param) -> { ... }(param) => { ... }lambda param: expression
비동기 처리async/await, DispatchQueueThread, ExecutorServiceasync/await, Promiseasync/await, threading
컬렉션 처리map, filter, reduce 등의 고차 함수Stream API(Java 8 이상): stream().map().filter().collect()map, filter, reduce 메서드 사용 가능map(), filter(), reduce() 사용

JAVA

public static void main(String[] args) 에 대한 이해

이 게시물에 내가 궁금했던 내용이 아주 잘 작성되어 있기 때문에 링크로 걸어둠. 구글에 java main 함수 치자마자 나온다. 다들 궁금한게 비슷한가...
어쨌든 저 args는 커맨드라인에서 실행하면서 입력받을 수 있는 인자고 사용해도 되고 안 해도 됨. 커맨드라인으로 입력되는 것들이 다 String으로 받아지고 이걸 배열로 받아서 처리하기 때문에 String[] 형식이라는 것이다.

인터페이스와 추상화 클래스의 차이

개념적으로 어...둘이 비슷한거 아닌가 해서 알아봤다.

특성인터페이스추상 클래스
사용객체의 행동 규약을 정의객체의 공동 상태와 행동을 정의
다중 구현여러 인터페이스를 구현 가능 (implements)단일 상속만 가능 (extends)
메서드모든 메서드는 기본적으로 추상적으로, 구현이 필수적추상 메서드와 일반 메서드 모두 포함 가능
필드static 및 final만 허용, 즉 상수만 가능인스턴스 변수와 정적 변수 모두 선언 가능

쉽게 코드로 표현하면 다음과 같다.

인터페이스 코드

interface Flyable {
    void fly(); // 추상 메서드
}

interface Swimable {
    void swim(); // 추상 메서드
}

// 여러 인터페이스를 구현 가능
class Duck implements Flyable, Swimable {
    @Override
    public void fly() {
        System.out.println("Duck is flying!");
    }

    @Override
    public void swim() {
        System.out.println("Duck is swimming!");
    }
}

public class InterfaceExample {
    public static void main(String[] args) {
        Duck duck = new Duck();
        duck.fly();  // Duck is flying!
        duck.swim(); // Duck is swimming!
    }
}

인터페이스는 상태(필드)를 가질 수 없기 때문에 다음과 같이 필드를 선언하면 오류가 난다.

Flyable.someField = "value"; // 오류 발생!

추상화 클래스 코드

abstract class Animal {
    String name; // 필드: 공통 상태를 정의

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

    abstract void sound(); // 추상 메서드: 하위 클래스에서 구현 필요

    void eat() { // 일반 메서드: 기본 구현 제공
        System.out.println(name + " is eating.");
    }
}

// 단일 상속만 가능
class Dog extends Animal {
    Dog(String name) {
        super(name);
    }

    @Override
    void sound() {
        System.out.println(name + " says Woof!");
    }
}

public class AbstractClassExample {
    public static void main(String[] args) {
        Dog dog = new Dog("Buddy");
        dog.sound(); // Buddy says Woof!
        dog.eat();   // Buddy is eating.

        // 추상 클래스는 필드를 가질 수 있으므로, 아래처럼 상태를 저장할 수 있음
        dog.name = "Charlie";
        System.out.println("Dog's new name: " + dog.name); // Dog's new name: Charlie
    }
}

JavaScript

profile
정체되지 않는 성장

0개의 댓글