변수란?
변할 수 있는 값을 저장하는 공간
하지만 '변수의 불변성'이란?
변수의 값을 변할 수 있게 하는 것!
말이 너무 어렵죠? 예를 한번 들어 보겠습니다
public class ImmutableObject {
// 접근제어자가 private 이므로 외부에서 value의 값을 변경하는 것이 불가능하다.
private final int value;
// 생성자에 전달받은 값으로 value를 초기화한다.
public ImmutableObject(int value) {
this.value = value;
}
// value의 값을 반환한다.
public int getValue() {
return value;
}
}
선언 클래스는 생성자를 통해 'value'라는 값이 정해집니다
그렇게 한번 정해지면 변경할 수가 없죠
하지만 'ImmutableObject'의 'value' 값이 항상 같은 것은 아니죠!
'처음으로 내부 속성을 설정한 이후로 변경이 불가능한 객체'를 '불변 객체' 라고 부르는데,
이를 Java에서 표현 하려면 어떻게 해야 할까요?
바로 변수 앞에 키워드를 사용하여 변수의 불변성을 표현합니다
final int age = 20;
이 코드는 "변수의 값을 더 이상 바꾸지 않겠다"를 표현합니다
Java에서 'final' 키워드는 "변수가 더 이상 변경될 수 없다"는 것을 의미하죠
이런 식으로 선언하여 불변성을 보장하는데,
// Activity의 시작 시간을 저장하는 변수
long startTime = System.currentTimeMillis();
이전 작업한 코드를 예로 들면,
시작시간을 저장해 주는데, 만약 값이 변경된다면 잘못된 정보가 나오는 것이죠
final long startTime = System.currentTimeMills();
'final'을 이용해 잘못된 정보가 나오지 않도록 수정해 주면 더 좋겠죠?
그리고 이렇게 설정하면 실수 방지뿐 아니라
변경되지 않을 것을 알고 우리 코드의 메모리를 효율적으로 관리하는 효과까지!
프로세스와 쓰레드, 그리고 멀티쓰레드 프로그래밍
쓰레드(Thread)란?
'어떠한 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위'
프로그램은 운영체제('사람과 장치를 연결하는 소프트웨어')로 실행되죠!
컴퓨터는 CPU라는 장치가 메모리에 명령어를 읽어 순차적으로 실행하는데,
특정 프로그램 코드만 계속 실행하면 어떻게 될까요?
그러면 동시에 여러 프로그램을 실행할 수가 없어집니다!
하지만 요즘엔 모두 여러 운영체제 프로그램을 동시에 실행합니다
동영상을 틀어놓고 멀티모니터 등으로 블로그를 쓴다던지,
유튜브나 넷플릭스 등 영상매체를 틀어놓고 검색을 한다던지,
혹은 게임을 병행하면서 웹서핑을 하는 식인데요
이런 여러 프로그램이 동시 실행되는 것이 바로 '멀티 프로세스(Multi Process) : 연속적으로 실행되고 있는 프로그램'입니다
그렇다면 이제 남은 친구는 '쓰레드' 겠죠?
하나의 프로그램에서 여러 개를 쓰는 경우도 존재하는데 예를 들어 보겠습니다
ex) 1~100까지 숫자를 더하는 프로그램,
이 덧셈 작업은 하나의 CPU에서 1~100까지 더하는 방법도 있지만
두 개의 CPU에서 작업을 2가지로 쪼개서 1~50까지 더하고 51~100까지 더한 후 합하는 방법도 존재합니다
이렇게 진행하면 2배의 효율을 보여주는 것이죠!
이러한 프로세스 내에서 작업을 2가지로 나누는 등을 '쓰레드'한다 라고 합니다
최근 컴퓨터는 보통 CPU코어가 여러 개이기 때문에 최근엔 더더욱 멀티쓰레드 프로그래밍이 베리 임포털트!!!

함수형 프로그래밍
함수형 프로그래밍이란?
'자료의 처리를 수학적 함수와 가깝게' 처리하여 '가변 데이터를 멀리하는'
함수형 프로그래밍이 최근 인기 있는 이유는 '객체 지향 프로그래밍의 단점'을 개선하기 때문이죠!
객체 지향 언어는 객체의 상태, 함수에 입력된 조건이 같아도 결과가 달라집니다
public class Person {
int age = 0;
public int plusAge(int otherAge){
return age + otherAge;
}
}
'plusAge()' 함수는 같은 파라미터인 '3'을 전달해도 'Person' 클래스 멤버 변수 'age' 값에 따라 결과가 달라지게 됩니다
이런 '객체 지향 언어에서 상태값에 따라 입력값이 같아도 다른 결과가 되는' 이유입니다
이 프로그램 실행 값은 바뀌기 때문에 함수의 코드만 보고 결과를 예상하기는 힘듭니다
그리고 예측하기 어려운 점은 프로그램에 버그 혹은 에러 발생 시 찾아내기도 여간 쉽지 않죠
(타도 버그... 외쳐 갓 로그캣)
이러한 '결과 예측이 어려운' 단점이 객체 지향 프로그램의 문제점이라 대체제인 '함수형 프로그래밍'이 인기쟁이가 되었죠
public staric int plus(int param1, int param2) {
return param1 + param2;
}
같은 값을 전달하면 param1과 param2는 항상 같은 결과를 산출하여 수학적 함수처럼 코딩합니다
그래서 결과 예측이 쉽기에 '불변성'이 중요하고 변경 가능한 변수로 예측을 차단하는 겁니다
모두 불변을 하나는 것은 아니지만 '변할 수 있는 요소'와 '변경 불가능한 요소'를 구분 지어 생각하는 게 핵심입니다!
'개발일지' 카테고리의 다른 글
공통 UI 구현 (0) | 2024.11.21 |
---|---|
kotlin 변수 샘플 앱 (1) | 2024.11.20 |
Java 변수 샘플 앱 (0) | 2024.11.18 |
메인 액티비티 연결 (2) | 2024.11.17 |
안드로이드 앱 프로그래밍 가이드 with Java/Kotlin (1) | 2024.11.16 |