지금 듣는 CS 강의에서 JAVA, JS 코드를 위주로 설명해주는데 이해가 어려워서 써놓는 게시물
구성은
야매라 잘못된 내용 있음 알려주시면 감사드리겠습니다...
특성 | Swift | Java | JavaScript | Python |
---|---|---|---|---|
타입 시스템 | 정적 타입 강타입 (타입 안정성 보장) 타입 추론 지원 | 정적 타입 강타입 (타입 안정성 보장) | 동적 타입 약타입 (유연성, 오류 위험) | 동적 타입 강타입 (타입 안정성 있음) |
메모리 관리 | 자동 참조 카운팅 (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 개발 | 데이터 분석 머신러닝 웹 개발, 스크립트 처리 |
개념 | Swift | Java | JavaScript | Python |
---|---|---|---|---|
파일 구조 | import로 모듈 가져오기, 클래스/구조체 선언, 함수 및 메서드 정의 | package/import로 모듈 가져오기, 클래스 선언 필수, 클래스 내부에 메서드 작성 | import로 모듈 가져오기, 클래스/객체 사용 선택적, 함수/변수 중심으로 구성 가능 | import로 모듈 가져오기, 함수/클래스 정의, 스크립트 실행 |
Entry Point | main() 함수(필요 시 정의, 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) -> ReturnType | public 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, open | private, protected, public, default(패키지 내 접근 가능) | 없음(ES6 이후 # 사용 시 private 가능) | 없음 |
에러 처리 | do-try-catch(Error 프로토콜 준수) | try-catch-finally | try-catch-finally | try-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, DispatchQueue | Thread, ExecutorService | async/await, Promise | async/await, threading |
컬렉션 처리 | map, filter, reduce 등의 고차 함수 | Stream API(Java 8 이상): stream().map().filter().collect() | map, filter, reduce 메서드 사용 가능 | map(), filter(), reduce() 사용 |
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
}
}