오늘 배운 개념은 솔직히 완벽하게 이해가 많이 어려웠다. 흔히 개발자들에게 필요한 "개발자적 사고"가 나에게는 당연히 부족하다. 그래도 꾸역꾸역 정리 해보고, 또 오늘은 숙제가 있다. 숙제는 다양한 풀이로 풀어낼 수 있을 것 같은데 이해는 되지 않았지만 오늘 배운 것 자체는 내게 재미있게 다가왔다. 서론은 그만두고 오늘 배운 것을 나열해보자면 변수의 생명주기(변수의 라이프 사이클)를 배우면서 다양한 변수(전역변수, 지역변수, 매개변수, static, [인자, 인수, args])를 함수와 함께 배우고 return이 뭔지 배웠다. 개념 자체가 완벽히 이해가 되지는 않았지만 어렴풋이, 또 감각적으로 사용은 할 수 있었다. 부디 정리하면서 내가 완벽하게는 아니더라도 어느정도 이해를 했으면 좋겠다.
함수
함수를 알기 위해서 수업에서는 계속해서 메서드를 사용했다. 아마 메서드의 개념과 함수의 개념이 비슷하기 때문이 아닐까 생각한다. 프로그래밍에서 함수를 설명할 수 있으면 메서드도 설명할 수 있을 것이다.
메소드란 객체(class)에 속한 함수를 의미한다. 객체는 클래스의 인스턴스이며, 클래스는 데이터와 함수를 포함하는데, 이 때 함수를 메소드라고 한다. 메소드는 객체의 상태에 따라 동작하며(동적), 객체가 하나 이상의 속성을 가질 때 사용된다. 자동차를 예로 들어보면 자동차 클래스에는 시동켜기, 브레이크, 엑셀밟기 등의 메서드가 필요하다는 의미이다. 반면, 함수는 입력 값을 받아 처리한 후 출력 값을 반환하는 기능을 한다. 함수는 어떠한 객체에 속하지 않으며, 입력 값에만 영향을 받는다. 예를 들어, 특정 숫자열을 입력 받아 해당 숫자열의 합계를 반환하는 함수를 작성할 수 있다. 내가 푼 문제의 코드를 보면, 이런식으로 작동한다.
import java.util.Scanner;
class Main {
public static void main(String[] args) {
계산기.더한결과를_화면에_출력(10, 20);
// 출력 => 결과 : 30
}
}
class 계산기 {
public static void 더한결과를_화면에_출력(int a, int b) {
System.out.println(a + b);
}
}
따라서, 메소드와 함수의 가장 큰 차이점은 사용되는 방법에 있다. 메소드는 객체에 속해 있으며, 객체의 상태에 따라 동작한다. 반면, 함수는 객체와 상관 없이 입력 값을 처리하고 반환 값은 입력 값에만 의존한다.
참고한 출처링크
이렇듯 솔직히 말하면 정말 어렴풋이 이해가 된다는게 정확한 것 같다.
변수의 생명주기(with 변수들)
모든 변수는 생명주기라는 걸 가지게 된다. 생명주기란, 변수가 생성되고 죽는걸 말한다. 이런 간단하게 클래스 내에서 선언하는 변수 를 인스턴스 변수라고 하고, 메소드 내에서 선언하는 변수를 지역변수라고 한다. 역시 코드를 보면 이해하기 쉬울 것이다.
public class test {
int a ; //-> 인스턴스 변수, 전역 변수
static int b; //-> 클래스 변수, 정적 변수
void test2(int c) { //-> 매개 변수, 파라미터(Parameter)
int d = 1; //-> 지역 변수
}
}
각 변수의 생명주기에 대해서 알아 보면, 인스턴스 변수는 객체(class)가 생성될 때, 변수가 생성된다. 즉, 현재 Test 클래스를 static main 메소드나 다른 클래스에서 인스턴스를 생성할 때 생성이 된다.
그리고 인스턴스는 참조가 없을 때 가비지 컬렉터가 객체를 지워버리게 되는데 이때, 인스턴스 변수도 같이 소멸된다.
매개변수는 예를들어 저 코드의 test2()
의 메소드가 호출 될 때 1이 생성되고 test2()
의 메소드가 종료 시점에 int c
로 소멸 된다.
지역 변수는 ‘ { ‘ 가 시작되는 시점에 생성되며, ‘ } ‘ 로 끝나는 시점에 소멸된다.
마지막으로 클래스 변수인 정적변수는 클래스가 처음 호출 되면서 생성이 되고, 자바 어플리케이션이 종료되는 시점에 같이 소멸된다.
이런 생명주기를 가진다는 것은 인지하고 어느 변수가 어느 코드에 들어가는지 유심히 살펴볼 줄 알아야지 내가 코드를 실행시켰을 때 어떤 결과가 나오는지 예상할 수 있다.
return
이건 코드로 좀 보자.
class 계산기 {
public static void 더한결과를_화면에_출력(int a, int b) {
System.out.println(a + b);
} //-> void는 리턴 값을 가지지 않는다는 규칙을 갖는다.
public static int 더한결과를_화면에_출력(int a, int b) {
return a + b;
} // -> 이 메소드는 두개의 입력 값을 받아서 서로 더한 결과 값을 돌려주는 메소드.
}
아까 위에 푼 문제 코드를 원래 코드와 아래는 약간 변형한 코드가 보일 것이다. 당연히 위에 main 클래스의 타입과 일치해야하며 메인 클래스에서 변수를 활용해 return 값을 출력할 수도 있다.
그렇게 활용해서 오늘 숙제중 한 문제를 풀어보면 이런 코드가 나온다.
class Main {
public static void main(String[] args) {
int a = 계산기.더한결과를_화면에_출력(10, 20);
System.out.println(a);
// 출력 => 결과 : 30
int b = 계산기.더한결과를_화면에_출력(50, 20);
System.out.println(b);
// 출력 => 결과 : 70
int c = 계산기.뺀결과를_화면에_출력(50, 20);
System.out.println(c);
// 출력 => 결과 : 30
int d = 계산기.뺀결과를_화면에_출력(5, 2);
System.out.println(d);
// 출력 => 결과 : 3
int e = 계산기.곱한결과를_화면에_출력(5, 2);
System.out.println(e);
// 출력 => 결과 : 10
}
}
class 계산기 {
public static int 더한결과를_화면에_출력(int a, int b) {
return a + b;
}
public static int 뺀결과를_화면에_출력(int a, int b) {
return a - b;
}
public static int 곱한결과를_화면에_출력(int a, int b) {
return a * b;
}
}
오늘 배운 것들은 이런 내용이였으며 나는 숙제를 하러 가보려고 한다.
'Coding History' 카테고리의 다른 글
2024. 06. 06 객체지향 프로그래밍이 뭔가요? - 얄팍한 코딩사전 (0) | 2024.06.06 |
---|---|
국비 지원 IT(웹앱개발) 취업반 강의 7일차 (2) | 2024.06.05 |
국비 지원 IT(웹앱개발) 취업반 강의 5일차 (2) | 2024.06.03 |
국비 지원 IT(웹앱개발) 취업반 강의 4일차 (0) | 2024.05.31 |
국비 지원 IT(웹앱개발) 취업반 강의 3일차 (0) | 2024.05.30 |