필자가 지속적으로 자바를 복습하는 이유는,
한 가지 언어를 완벽하게 구사하기 위해서입니다.
여러 언어를 익히는 것도 좋지만, 저는 Java를 완벽하게 정복하고 싶습니다.
따라서, 이전에 공부했던 내용이지만, 다른 교재 및 강의를 지속적으로 시청하고 있으며, 이에 따라 지속적으로 Java에 대해 포스팅하게 되었습니다.
또한, 코딩테스트 및 알고리즘을 게을리 하지 않고, 매일 공부하고 있습니다 ! 🏃♂️
(먼 미래엔 제가 자바를 강의할 정도의 실력이 되어 있길🙏)
강의 출처 : 인프런 자바 입문, 인프런 자바 100제 , 자바 TPC
교재 출처 : 명품자바 프로그래밍, 두잇 자바, 자바의정석
개발 환경 : IntelliJ IDEA
public class JavaExam{
public void helloWorld(){
System.out.println("Hello,World);
}
public static void main(String p[args){
// 메서드 호출
helloWorld();
}
}
메인메서드가
static
메서드로 되어있기 때문에, 메서드 호출에도static
을 해줘야 호출할 수 있습니다. (스태틱은 스태틱끼리 호출할 수 있음)
(반환 값이 없다는 것은 void를 써주면 된다는 것)
-> void는 return을 안하니까.
즉, return 쓰려면 자료형 타입으로 와야해서 (필자생각)
public class Main {
// <span><!>반환 값이 없다는 것은 void를 써주면 된다는 것.<!></span>
public static void showMenu(){
System.out.println("showMenu 호출 ");
}
public static void main(String[] args) {
showMenu();
}
}
// 반환값이 없고 받는 인자값이 2개 있는 덧셈 메서드를 구현
-> 받는 인자 값이 있다는 뜻은,
내가 함수를 호출하는 순간, 리턴값은 없지만, 이 함수(메서드)가 호출부에서 파라미터 값을 넘긴다는 뜻
public class Main {
private static void sum(int x, int y){
System.out.printf("인자로 넘겨받은 2개 값 %d,%d \n",x,y);
System.out.print("합은"+(x+y));
}
public static void main(String[] args) {
int a = 10, b= 20;
sum(a,b);
}
}
-> 메서드(함수) 호출에 따른 리턴값이 있는 것임, 호출 시 리턴 값을 받는 변수를 정의
public class Main {
private static int returnMethod(){
int result = 100;
result*=200;
return result;
}
public static void main(String[] args) {
int result;
result = returnMethod(); // 호출해서 그것을 변수에 저장
// Output
System.out.println(result);
}
}
// 메서드 ("java") 입력 시, 대문자로 출력되게
-> 호출 시 리턴값을 받는 변수를 정의한다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
private static String returnMethod(String str){
String changeStr = str.toUpperCase();
return changeStr;
}
public static void main(String[] args)throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
System.out.print(returnMethod(str));
}
}
틀린 부분 찾기
public class java {
public static String capitalMethod( String str ) {
String ret = str.toUpperCase();
return ret;
}
public static void main(String[] args) {
String rst;
rst = capitalMethod( 'java' );
System.out.println( "입력한 소문자의 대문자는 = "+ rst );
}
}
정답이 궁금하시면 댓글 남겨주시면 감사하겠습니다.
// static 선언이 안되어있는 메서드를 사용하는 방법에 대해서 코드로 구현해보시오.
public class java {
public void helloWorld() {
System.out.println("Hello,");
}
public static void main(String[] args) {
helloWorld();
}
}
스태틱이 선언되어 있으면, 클래스명.메서드명();
으로 원래 접근하면 되지만,
스태틱이 없다면 객체를 생성해서 사용하면 되는거임.
public class java {
public void helloWorld() {
System.out.println("Hello,");
}
public static void main(String[] args) {
// 객체 생성 후 메서드 호출
java jes = new java(); // 객체 생성
jes.helloWorld();
}
}
// Call by Value
public static void sum( int a ){
a += 400;
System.out.println( a );
}
public static void main(String[] args) {
int a = 100;
sum( a ); // Call by Value 방식
System.out.println( a );
}
Call by value --> 값에 의한 호출 (값 자체를 보낸다는 것임)
메서드로 인자값을 넘길 때, 해당 값을 복사하여 넘기는 방식 --> 따라서, sum()메서드 내부에서는 복사된 값으로 처리를 한다.
참조형 타입은 너무 무거워서 고래(값)가 죽은 위치만 사람 핸드폰에 위치만 적어서 가지고 다니는 것.
언제든지 위치를 확인하면 갈 수 있으니까.
참조형 타입은 객체나 배열 같은 것들은 주소 값만 전달됨.
참조형 타입은 주소값을 공유하기 때문에, 값이 공유됨.
즉, 주소 값은 값 자체가 공유됨.
그런데, 값 전달은 서로 관여 x -> 값 자체를 보내버렸기 때문에
즉, 값에 의한 호출 -> 값에 의해서 (메서드를) 호출
크기가 큰 객체나 배열 등의 데이터를 효율적으로 처리하기 위해 사용됩니다.
이 경우 값이 아닌 주소 값만 전달되어 데이터의 무게를 줄입니다.
주소값을 공유하므로, 실제 데이터도 공유됩니다.
값 전달 방식은 데이터 자체를 전송하기 때문에, 서로 영향을 주지 않습니다. 이 방식은 값을 이용해 메서드를 호출하는 것으로 이해됩니다.
참조형 타입은 주소값을 공유하여 데이터를 처리하고, 값 전달 방식은 값을 직접 전송하여 메서드를 호출합니다.
// Call by reference
// a 값이 같은 결과가 나오도록 코드 수정
Wrapper 클래스의 Integer 클래스 타입으로 변수 a를 선언하고, new로 객체를 생성하여, 해당 주소 값을 메서드로 보내는 것입니다.
public class Main {
public static void sum(int[] a){
System.out.println(a); // 주소 값이 찍히는게 아니라 100이라는 값이 찍힘.
}
public static void main(String[] args) {
Integer a = new Integer(100);
sum(a);
System.out.println(a);
}
}
즉, call by value방식으로 사용됨.
public class Main {
public static void sum(int[] a){
System.out.println("sum()메서드 안 a값"+a);
}
public static void main(String[] args) {
int[] a = new int[5];
sum(a);
System.out.println("main()메서드 안 a값"+a);
}
}
public class Main_java_Method {
public static void sum(Main_java_Method a){
System.out.println(a);
}
public static void main(String[] args) {
Main_java_Methodain a = new Main_java_Method(); // 객체 생성
sum(a);
System.out.println(a);
}
}
class TestNumber{
int num;
TestNumber(int num){this.num = num;}
}
이 클래스에서 어떤 객체가 생성될 때, 생성자가 제일 먼저 호출이 되어지는,
생성자는 이 클래스의 객체가 만들어질 때, 제일 먼저 실행되는 메서드가 되는 것.
이때 this
는 그 객체를 의미함.
class TestNumber{
int num;
TestNumber(int num){this.num = num;}
}
public class Main {
public static void sum(TestNumber a){ // 파라미터를 int 에서 TestNumber 로 바꿔줌.
System.out.println(a); // a값을 출력해보면 주소가 들어있음
System.out.println(a.num); // 100 출력, a라는 객체의 num
a.num += 400; // 이렇게 더하면 주소값 더하기임. 공유된 주소를 더함
System.out.println(a.num); // 100 출력, a라는 객체의 num
}
public static void main(String[] args) {
TestNumber a = new TestNumber(100); // a는 주소값을 가지고 있음.
sum(a); // 주소 값을 전달함
System.out.println("==============");
System.out.println(a.num); // 100 -> 같은 곳을 가리킴, 만약 같은 주소값 참고한 곳을 수정하면 해당 값도 변경됨.
}
}
// 아래의 코드에서 2개의 리턴 값을 받는 코드는 (1)과 (2)중 어느 것인가?
// (1)
public static int[] testMethod() {
int num1 = 100;
int num2 = 200;
return num1, num2;
}
// (2)
public static int[] testMethod() {
int num1 = 100;
int num2 = 200;
return num1;
return num2;
}
public class Main{
private static int testMethod(){
int num1 = 100;
int num2 = 200;
return new int[]{num1, num2};
}
public static void main(String[] args) {
int result = testMethod();
System.out.println(result);
}
}
위 코드를 보고, 틀린 부분들을 수정해주세요.
public class Main{
private static int[] testMethod(){ // 배열로 반환시 타입이 int 면 에러뜸. 반환하는 타입을 int[]로 수정해줘야함
int num1 = 100;
int num2 = 200;
int num3 = 300;
return new int[]{num1, num2, num3};
}
public static void main(String[] args) {
int [] result = testMethod(); // 배열 변수를 선언 --> 메서드로 부터 반환 받을 값이 배열이기 때문에
// 배열은 참조형 타입.
System.out.println(result); // 배열명을 그냥 찍으면, 주소 값이 출력됨. (참조형 타입이라서)
// 배열이 생성된 공간의 주소를 result 가 알고있음.
// 아래처럼 각각 출력해야함.
System.out.println(result[0]+"-"+result[1]);
// 연산
System.out.println(result[0]+ result[1]);
// 배열 안에 있는 모든 요소를 출력하고 싶을 때,
System.out.print(Arrays.toString(result)); // 모든 요소 출력 --> 반복문 사용 없이
}
}
주소값을 찍었을때,
[
은 배열을 의미
[
이후에I
|| D
가 오는데, 정수인지 실수인지를 알려주는 것입니다.
// 메서드는 ( "korea", "USA" ) 입력시 소문자는 대문자로 대문자는 소문자로 출력되도록 구현
import java.util.Arrays;
public class Main{
private static String[] capitalMethod(String str1, String str2){
String UpperChange = str1.toUpperCase();
String LowChange = str2.toLowerCase();
// 리턴 값 2개를 저장할 배열 변수 선언
String [] ret = {UpperChange,LowChange};
return ret; // 배열만 리턴
}
public static void main(String[] args) {
// 반환 값 O, 받는 인자 값 O
// 반환값이 있다는 것 -- > 메서드(호출) 호출에 따른 리턴 값이 있다는 것 --> 호출부에서 리턴값을 받는 변수 정의.
String[] result = capitalMethod("korea","USA");
System.out.println(result); // 배열명을 찍으면 주소값이 출력됨.
System.out.println(Arrays.toString(result));
}
}