Java
자바 함수 핵심
public static final int MAX_N = 100;
//
//final (Java):
final은 값을 변경할 수 없는 변수를 선언할 때 사용합니다.
기본 데이터 타입(예: int, double)에서는 값 자체가 고정됩니다.
참조 데이터 타입(예: 객체, 배열)에서는 **참조(주소)**가 고정되지만, 객체의 내부 상태는 변경할 수 있습니다.
클래스나 메서드에도 사용할 수 있어 상속을 금지하거나 오버라이딩을 방지할 수 있습니다.
//
//const (JavaScript):
const는 재할당이 불가능한 변수를 선언할 때 사용합니다.
기본 데이터 타입에서는 값 자체가 고정됩니다.
객체나 배열 같은 참조 데이터 타입에서는 **참조(주소)**가 고정되지만, 내부의 값을 변경할 수 있습니다.
const는 **블록 범위(block scope)**를 가지며, 선언된 블록을 벗어나면 유효하지 않습니다.
//
콜 바이 래퍼런스
즉, Java에서의 swap은 Reference type을 이용하여 다음과 같이 구현해야만 합니다
class IntWrapper {
int value;
public IntWrapper(int value) {
this.value = value;
}
}
Java에서 생성자는 반드시 클래스와 같은 이름을 가져야 합니다. 그리고 접근 제어자(access modifier)는 선택 사항입니다. 생성자의 접근 제어자는 다음과 같이 설정할 수 있습니다:
public: 클래스 외부에서도 생성자를 호출할 수 있습니다. 가장 일반적인 접근 제어자입니다.
private: 클래스 내부에서만 생성자를 호출할 수 있습니다. 일반적으로 싱글턴 패턴(Singleton pattern)이나 정적 메서드만을 통해 객체 생성을 허용할 때 사용됩니다.
protected: 같은 패키지에 있는 다른 클래스나 해당 클래스를 상속받은 서브 클래스에서 생성자를 호출할 수 있습니다.
default (아무 접근 제어자도 지정하지 않음): 같은 패키지 내의 클래스에서만 접근할 수 있습니다.
public class Main {
public static void swap(IntWrapper n, IntWrapper m) {
int temp = n.value;
n.value = m.value;
m.value = temp;
}
public static void main(String[] args) {
IntWrapper n = new IntWrapper(10);
IntWrapper m = new IntWrapper(20);
swap(n, m);
System.out.println(n.value + " " + m.value); // 20 10
}
}
clone , 배열
가장 간단한 방법으로, 함수로 값을 넘길때 다음과 같이 .clone()을 하게 되면 기존 배열과 동일한 원소를 갖는 새로운 배열을 만들어 넘겨주게 되므로, 함수 안에서의 변화가 함수 밖의 변수에 영향을 끼치지 않게 됩니다.
public class Main {
public static void modify(int[] arr2) { // arr2는 arr와 관련이 없다.
arr2[0] = 10;
}
public static void main(String[] args) {
int[] arr = new int[]{1, 2, 3, 4};
modify(arr.clone()); // 새로운 배열을 만들어 넘기기
for(int i = 0; i < 4; i++)
System.out.print(arr[i] + " ");
}
}
>> 1 2 3 4 # 값에 변화가 없다
import java.util.Scanner;
public class Main {
public static final int MAX_N = 50;
public static int n;
public static int[] arr = new int[MAX_N];
// 위에 처럼 선언을 main밖에 해줘서 써죽
public static void modify(int[] arr) {
for(int i = 0; i < n; i++)
if(arr[i] % 2 == 0)
arr[i] /= 2;
}
public static void main(String[] args) {
// 변수 선언 및 입력:
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
for(int i = 0; i < n; i++)
arr[i] = sc.nextInt();
modify(arr);
for(int i = 0; i < n; i++)
System.out.print(arr[i] + " ");
}
}
java는 String도 함수로 바로 연결못함
함수에서 해당 인자 값을 변경하였지만, 함수 밖에 있는 변수에는 영향을 끼치지 않는 것을 확인할 수 있습니다.
이는 String은 immutable하기 때문입니다. immutable하다는 것은 값을 바꿀 수 없는 type이라는 뜻입니다.
값을 바꿀 수 없으니 s += “apple”이라는 구문은 기존 s 문자열 뒤에 apple을 붙이는게 아닌, 실제 s + “apple” 를 계산하여 새로운 문자열을 만든 뒤 이 값을 s에 대입하게 됩니다.
동시에 String은 reference type입니다. 즉, 함수 안에서 변수 s에 새로운 값을 대입시켜봤자, main함수에서 정의된 “banana”라는 값에는 전혀 영향을 끼칠 수가 없는 것입니다.
public class Main {
public static void modify(String s) {
s += "apple";
}
public static void main(String[] args) {
String str = "banana";
modify(str);
System.out.print(str);
}
}
>>> banana
배열 length , 문자열 length()
int[] arr = {1, 2, 3, 4, 5};
int length = arr.length; // 배열의 길이
String str = "Hello, World!";
int length = str.length(); // 문자열의 길이
정렬
import java.util.Arrays;
int[] arr = new int[]{12, 41, 37, 81, 19, 25, 60, 20};
Arrays.sort(arr);
Arrays.sort(arr, 시작 Index, 끝 Index + 1)
///////
// 내림차순
import java.util.Arrays;
import java.util.Collections;
public class Main {
public static void main(String[] args) {
Integer[] arr = new Integer[]{12, 41, 37, 81, 19, 25, 60, 20};
Arrays.sort(arr, Collections.reverseOrder());
for(int i = 0; i < 8; i++) // 81, 60, 41, 37, 25, 20, 19, 12
System.out.print(arr[i] + " ");
}
}
즉 int 배열을
// 내림차순 정렬
Integer[] nums2 = Arrays.stream(nums).boxed().toArray(Integer[]::new);
Arrays.sort(nums2, Collections.reverseOrder());
이렇게 하여서 Integer로 바꾸어주어야한다.
//
반대로 Integer를 int배열로
// Integer[]를 int[]로 변환
int[] intArray = Arrays.stream(nums).mapToInt(Integer::intValue).toArray();