본문 바로가기
Computer Science/Java

Java 기초 배울 때 놓치기 쉬운 것들 정리

by 코듀킹 2024. 9. 29.

1. Java 기본 구조

  • 프로젝트 > 패키지 > 클래스 > 메소드 > 소스코드
    • 프로젝트 만들기 단축키 : Alt + Shift + n
      • 이후, 아랫방향키 + 엔터치고, 프로젝트 이름 지정(버전 잘 맞춰줘야함.)
    • 패키지 만들기 단축키 : src 폴더에서 Ctrl + n
      • 이후, pack 검색 후 엔터치고, 패키지 이름 지정(소문자로 시작해야함.)
    • 클래스 만들기 단축키 : Ctrl + n
      • 클래스 선택 후 엔터치고, 클래스 이름 지정(대문자로 시작해야함.)
    • main 메소드 단축키 : main 쓰고, Ctrl + 스페이스바

 

한줄 통째로 지우는 단축키 : Ctrl + D

주석 : Ctrl + /

 

 

2. 변수 선언시 주의사항

반드시 초기값을 설정해주어서 초기화 시켜주어야함. 초기화를 안하면, RAM에 남아있는 가비지 값이 그대로 들어와 버림.

 

 

3. 형변환

  • 자동 형변환
    • 정수 + 실수 = 실수
    • 문자 + 정수 = 정수
  • 강제 형변환 
    • (자료형)값;
  • 문자열 형변환
    • Interger.parseInt("")
    • Float.parseFloat("")
    • Double.parseDouble("")

 

 

4. 입력 클래스

형태

Scanner sc = new Scanner(System.in);
sc.next();

 

next() : 사용자가 입력한 문자열 값

  • 사용자가 입력한 값 중 공백 또는 줄바꿈 문자를 구분점으로 각 문자열을 분리
  • 첫 번째 문자열은 첫 번째 next()에 담고, 두번째 문자열은 두 번째 next()에 담

nextLine() : 사용자가 입력한 문자열 값

  • 공백 또는 줄바꿈 문자도 값으로 취급하기 때문에 그대로 입력

nextInt() : 사용자가 입력한 정수 값

 

 

5. 연산자의 우선순위

최우선 연산자

단항 연산자

산술 연산자

쉬프트 연산자

관계 연산자

논리 연산자

삼항 연산자

대입 연산자

 

 

6. while문 빠져나가기

flag = true;

if(flag) {break;}

 

 

7. 배열의 선언

  • 자료형[] 배열명 = {값1, 값2, ...};  -> 어떤 값을 넣을지 알 때 사용
  • 자료형[] 배열명 = new 자료형[칸수]; -> 어떤 값을 넣을지는 모르나, 몇 칸 만들지는 알 때 사용
  • 자료형[] 배열명 = null; -> 어떤 값을 넣을지도 모르고, 몇 칸 만들지도 모를 때 사용

 

8. 변수 선언시 자료형 앞에 붙는 new

  • Heap 메모리에 할당, 초기값으로 자동 초기화

 

9. .length()

문자열이 담긴 변수에 .length()를 하면, 문자열의 길이를 불러옴.

 

10. .charAt(인덱스)

문자열이 담긴 변수에 .chatAt(인덱스)를 하면, 해당 인덱스에 담긴 값을 불러옴.

 

11. .indexOf(문자)

문자열이 담긴 변수에 .chatAt(문자)를 하면, 해당 문자가 담긴 인덱스를 불러옴.

 

 

12. 2차원 배열 선언

  • 자료형[][] 배열명 = {{값1, 값2, 값3, ...}, {값4, 값5, 값6}};
  • 자료형[][] 배열명 = new 자료형[행][열];
  • 자료형[][] 배열명 = null;
    • 배열명.length : 행의 길이
    • 배열명.length[행] : 열의 길이

 

13. 메소드 선언

  • (1) 리턴타입 (2)메소드명(자료형 (3)매새변수명, ..) {
                     (4)실행할 문장;
                     (5)return 리턴값;
    }
  1. 리턴 값이 있다면 리턴 값의 자료형을 작성하고, 리턴 값이 없담면 비워놓지 않고 void를 작성
  2. 동사로 작성
  3. 외부에서 전달받을 값이 있담면, 자료형과 순서에 맞게 선언. 생략 시, 외부에서 값을 전달받을 수 없게 됨.
  4. 생략 가능. 메소드의 기능을 구현하는 로직을 작성
  5. 생략 가능. 리턴값이 있다면, 사용한 부분 통째로를 리턴값으로 봐야함.

 

14. void 메소드로 return 없이 변수 값 바꾸는 방법

  • 값이 아닌 주소값을 전달 하면 됨.

아래 코드에서 만약 data 변수를 배열로 정의하지 않고, 값으로 정의했다면, change() 메소드에 주소 값이 아닌 값을 전달할 수 밖에 없기 때문에 data의 값이 20으로 바뀌지 않고, 그대로 10이 된다.

// 주소 값 전달 예시
package methodTest;

public class Test {
	void change(int[] data) {
		data[0] = 20;
	}
	
	public static void main(String[] args) {
		int[] data = {10};
		System.out.println(data); // 결과 : [I@4909b8da
		new Test().change(data);
		System.out.println(data[0]); // 결과 : 20
	}
}
// 값 전달 예시
package methodTest;

public class Test {
	void change(int data) {
		data = 20;
	}
	
	public static void main(String[] args) {
		int data = 10;
		new Test().change(data);
		System.out.println(data[); // 결과 : 10
	}
}

 

Public, private

생성자, 기본생성자 

- 단축키 : ctrl + space

this, super

static

15. 클래스 필드로 선언하는 변수

아래 A클래스에서 data라는 변수에 초기값을 넣지 않았지만, 자동으로 초기화 된 것을 알 수 있다. 클래스 영역 안에서 선언된 변수는 모든 영역에서 사용이 가능하다. 그래서 전역 변수라고 한다. 2번에서는 반드시 초기값을 설정해주어야한다고 했는데, 이는 지역변수에 한해서 그렇다. 전역 변수는 자동으로 초기화가 된다.

package classTest;

class A {
//	전역변수 : 자동초기화가 된다.
	int data;
	
	void printData() {
		System.out.println(data);
	}
}

public class ClassTest {
	public static void main(String[] args) {
		A a = new A();
		a.printData(); // 결과 : 0
        	a.data = 10;
        	a.printData(); // 결과 : 10
	}
}

 

여기서 a.data = 10; 을 넣어주면 a.printData();의 결과 값은 10이 된다.

 

 

16. 기본 생성자

클래스를 선언하자마자 자동으로 생기는 생성자를 기본 생성자라고 한다. 위 코드에서는 A클래스 안에 A(){;} 라는 메소드가 없음에도 불구하고, new A();를 쓸 수 있었던 이유이다. 만약 아래와 같이 직접 A 클래스 안에 A(String name){} 메소드를 선언해버리면, 기본 생성자는 사라진다. 그래서 생성자 new A()를 사용할 때 String 타입의 매개변수를 넣지 않으면 오류가 발생하게 된다.

package classTest;

class A {
//	전역변수 : 자동초기화가 된다.
	int data;
	
    	A(String name){
    		System.out.println(name);
    	}
    
	void printData() {
		System.out.println(data);
	}
}

public class ClassTest {
	public static void main(String[] args) {
		A a = new A("홍길동"); // 결과 : "홍길동"
		a.printData(); // 결과 : 0
	}
}

 

 

17. 생성자 사용시 주소값 할당 방식

생성자를 사용할 때마다 해당 클래스의 필드를 메모리에 할당한 후, 부여된 주소값을 가져온다. 

package classTest;

class A {
//	전역변수 : 자동초기화가 된다.
	int data;
	
    	A(String name){
    		System.out.println(name);
    	}
    
	void printData() {
		System.out.println(data);
	}
}

public class ClassTest {
	public static void main(String[] args) {
		A a = new A("홍길동"); // 결과 : "홍길동"
        	A b = new A("홍길동"); // 결과 : "홍길동"
		System.out.println(a); // 결과 : classTest.A@3a03464
        	System.out.println(b); // 결과 : classTest.A@2d3fcdbd
	}
}

 

a와 b는 다른 주소가 할당되는 걸 알 수 있다.

 

 

18. 생성자로 전역변수 값 직접 접근해서 바꾸는 방법(this)

메소드는 구분점을 매개변수로도 잡는다. 그러니까 메소드 이름이 똑같아도 매개변수가 다르면, 서로 구분이 된다는 뜻이다. 이를 이용해서 똑같은 이름의 생성자를 여러개 생성한 뒤, 매개변수만 다르게 설정하면, 생성자를 사용할 때, 전역변수를 바로 접근해서 값을 바꿔서 사용할 수 있다.

 

이때, 중요한 점은 객체의 주소값을 전달해야 한다는 건데(14번 참고), 이는 this를 사용해서 해결할 수 있다. this는 접근한 객체가 가지고 있는 주소값을 담은 변수이다. 실제로 this를 출력해보면, a와 똑같은 주소를 가지고 있다는 걸 알 수 잇다.

 

package classTest;

class A {
//	전역변수 : 자동초기화가 된다.
	int data;
	
    	A(String name){
    		System.out.println(name);
	}
    
        A(int data){
    	    System.out.println(this); // 결과 : classTest.A@3a03464
            this.data = data; // this : 접근한 객체가 가지고 있는 주소값을 담은 변수
	}
    
	void printData() {
		System.out.println(data);
	}
}

public class ClassTest {
	public static void main(String[] args) {
		A a = new A(10);
        	System.out.println(a);  // 결과 : classTest.A@3a03464
        	a.printData(); // 결과 : 10
	}
}

 

댓글