본 게시글은 대학 전공수업을 들으며 노션에 정리한 내용을 블로그로 옮긴 것으로, 에디터 차이로 인해 일부 수식, 서식, 내용 등이 빠져 있을 수 있습니다.
노션 웹을 통해 최적화된 형태로 읽으시길 권해드립니다.(➡️ 노션 링크)
3강 - 배열, String, Scanner, 클래스, 접근제어자, 생성자
배열
코드
package lecture03; public class Array { public static void main(String[] args) { //선언 int[] a; String b[]; //초기화 /* new 연산자를 통해 메모리 공간 생성 * 메모리 주소값을 리턴함 * 원소가 숫자라면 '0', 참조형인경우 null 리턴 */ a = new int[3]; b = new String[4]; //선언 + 초기화 int c[] = {2, 3, 5, 7, 11}; //출력 System.out.println("a = " + a[0]); //0 System.out.println("b = " + b[0]); //null for (int num : c) { System.out.println("num = " + num); } //2차원 배열 int[][] matrix; // 2차원 배열 선언 matrix = new int[3][3]; // 2차원 배열 초기화 int[][] matrix2 = { {1, 2}, {3, 4}, {5, 6} }; //배열의 크기 System.out.println("matrix2.length = " + matrix2.length); //3행 System.out.println("matrix2.length = " + matrix2[0].length); //2열 // 배열 값 출력 for (int i = 0; i < matrix2.length; i++) { for (int j = 0; j < matrix2[i].length; j++) { System.out.println("matrix2[" + i + "][" + j + "] = " + matrix2[i][j]); } } } }
String 클래스
문자열을 표현하고 처리하기 위한 참조형
String 변수는 참조형이나 시본형 변수처럼 사용할 수 있음.
코드
package lecture03; public class StringClass { public static void main(String[] args) { String str1 = "Java"; String str2 = new String("Java"); //str1과 str2의 주소값은 다르다. //주소값 비교 System.out.println("str1 == str2 = " + (str1 == str2)); //문자열 비교 System.out.println("str1.equals(str2) = " + str1.equals(str2)); //String의 + 연산자 String str3 = str1 + str2; System.out.println("str3 = " + str3); // (문자열 + 기본형) or (문자열 + 다른 참조형) // +연산자 사용시 문자열로 자동 형변환 String numStr = "100"; int num = 0; System.out.println(numStr + num); // 1000이 출력 //참고 : 작은 따옴표 + 정수 => 아스키코드 값으로 System.out.println('A' + num); //165가 출력
}
}
```
Scanner 클래스
키보드나 파일로 부터 다양한 자료를 입력 받음
Scanner 객체 생성 방법
Scanner sc = new Scanner(System.*in*);
변수 sc로 new Scanner로 객체 생성
System클래스 안의 in이라는 스태틱 클래스 변수를 통해 키보드 입력 받음 (표준 입력 스트림)
코드
package lecture03; import java.util.Scanner; public class ScannerClass { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.print("단어 입력 :"); String word = sc.next(); sc.nextLine(); // 남아 있는 줄바꿈 문자를 처리 System.out.print("문자열 입력 : "); String str = sc.nextLine(); System.out.print("숫자(정수) 입력 : "); int num = sc.nextInt(); System.out.print("실수 입력 : "); double doubleNum = sc.nextDouble(); System.out.println("word = " + word); System.out.println("str = " + str); System.out.println("num = " + num); System.out.println("doubleNum = " + doubleNum); } }
클래스
정의
- 동종 객체를 표현하기 위한 데이터필드(멤버 변수)와 메소드를 정의
- 부모 클래스 상속, 인터페이스 구현, 추상 클래스, final 클래스 등을 정함
클래스 사용
인스턴스 변수(메소드)와 클래스 변수(메소드)
- ‘개별 객체’가 소유하는 인스턴스 변수와 인스턴스 메소드 : 객체가 생성될 때 마다 초기화
- ‘클래스에 속한 객체’가 공유하는 클래스 변수와 클래스 메소드
객체의 상태는 데이터 필드로 구현
행위와 기능은 메소드로 구현됨
아래 코드 참조시 이해하기 쉽다.
코드 : Circle
package lecture03; public class Circle { // 인스턴스 변수: 각 객체가 개별적으로 소유 private int radius; private float pie = 3.14f; // 클래스 변수: 모든 객체가 공유 private static int instanceCount = 0; // 생성자: 인스턴스 변수를 초기화하고, 클래스 변수 증가 public Circle(int radius) { this.radius = radius; instanceCount++; } // 인스턴스 메서드: 인스턴스 변수에 접근 가능 public double getArea() { return this.pie * this.radius * this.radius; } //----- getter/setter 메서드: 인스턴스 변수에 접근 가능 ------------------ public int getRadius() { return radius; } public void setRadius(int radius) { this.radius = radius; } public float getPie() { return pie; } public void setPie(float pie) { this.pie = pie; } //---------------------------------------------------------------- // 클래스 메서드: 클래스 변수에 접근 가능 public static int getInstanceCount() { return instanceCount; } }
코드 : CircleMain
package lecture03; public class CircleMain { public static void main(String[] args) { Circle circle1 = new Circle(5); // 첫 번째 Circle 객체 생성 Circle circle2 = new Circle(10); // 두 번째 Circle 객체 생성 System.out.println("circle1 반지름: " + circle1.getRadius()); System.out.println("circle1 넓이: " + circle1.getArea()); System.out.println("circle2 반지름: " + circle2.getRadius()); System.out.println("circle2 넓이: " + circle2.getArea()); // 클래스 메서드 호출: 모든 객체가 공유하는 클래스 변수 System.out.println("생성된 Circle 객체 수: " + Circle.getInstanceCount()); // System.out.println(circle2.radius); // java: radius has private access in lecture03.Circle 발생 } }
언제 사용하나?
- 클래스형 변수를 선언할 때 :
Circle circle;
- 객체를 생성할 때 :
Circle circle = new Circle(5);
- 상속받아 클래스를 정의할 때
Class Student extends Person
클래스 접근제어자
: 클래스의 사용 범위를 제한하는 것.(for 정보은닉)
클래스 외에도 데이터필드(멤버변수/인스턴스변수/속성), 메소드를 정의할 때도 접근제어자 사용.
접근제어자 종류
(생략), public, private, protected
private과 protected는 내부클래스에서만 사용
- default: 같은 패키지 내의 다른 클래스에서 사용 가능
- public : 모든 클래스에서 어디서나 사용 가능.
- private : 같은 클래스 내에서만 접근 가능. *접근을 위해 getter, setter는 public이다!
- protected : 같은 패키지 내의 다른 클래스와 자식 클래스에서만 접근
위 코드에서, 다른 클래스에서 System.out.println(circle2.radius);
실행시 java: radius has private access in lecture03.Circle
에러 발생
public → default → protected → private
객체의 사용
- 생성된 기존 객체를 사용하는 경우
- Shape myShape = circle; //부모 변수에 객체를 대입
- 객체를 메소드에 전달
- circle.r = 5; // 점 연산자로 멤버에 접근해 데이터를 읽음
- circle.getArea(); //점 연산자로 메소드 호출
생성자
- 객체가 생성될 때 자동으로 실행되는 메소드
- 객체 필드 값을 초기화하거나 메모리 할당 등의 작업
- new 클래스이름(인자…)
Circle c = new Circle(5);
- ⇒ new연산자로 객체를 생성(메모리 할당)
- ⇒ 생성자 호출(데이터필드 초기화)
- ⇒ 객체 참조값을 변수에 대입. (’=’ 를 통해) : c에다 Cricle(5) 주소값 대입
정의 방법
- 생성자 이름은 클래스와 같음
- 반환형 지정x (반환형 지정시 생성자가 아님)
- 한 클래스에서 여러 생성자를 정의할 수 있음 :
생성자 오버로딩
- 매개변수 갯수와 매개변수 자료형으로 구분함
- 접근제어자는 보통 public
기본 생성자
인자가 없는 생성자. default constructor
- 클래스에는 반드시 생성자가 있어야함.
- 따라서 단 하나의 생성자 정의가 없을 때,
public Cirlce() {}
과 같은 걸 자동으로 만들어 준다.
- 따라서 단 하나의 생성자 정의가 없을 때,
- 자식 클래스의 경우 생성자 첫줄에 명시적 호출이 없다면
super();
가 자동으로 들어간다. ⇒ 따라서 부모클래스에서 기본 생성자의 존재를 확인 해야함!
요약
- 배열은 원소의 초기화 과정이나 원소의 생성 과정을 거쳐야만 사용할 수 있다.
- ‘배열이름.length’을 사용하여 배열의 크기를 표현할 수 있다.
- 문자열 변수나 리터럴에 대해 + 연산을 적용한 결과는 두 문자열이 연결된 문자열이다.
- Scanner 클래스를 이용하면 키보드나 파일로부터 편리하게 문자열(또는 기본형 값)을 입력받을 수 있다.
- 클래스를 정의할 때, 내부 클래스가 아니라면 클래스의 접근 제어자로서 생략과 public만 지정할 수 있다.
- 정의 부분에서 접근 제어자가 생략된 클래스나 데이터 필드는 ‘해당 클래스’ 외에 ‘같은 패키지의 다른 클래스’에서만 사용할 수 있다.
- 생성자를 정의하려면 이름을 클래스 이름과 같게 하고 반환형을 지정하지 않는다.
'Back-End > Java' 카테고리의 다른 글
(전공 정리) 6강 - 제네릭, 람다식 (0) | 2024.06.22 |
---|---|
(전공정리) 5강 - 추상 클래스, 인터페이스, 다형성, enum, 익명클래스, 중첩클래스 (0) | 2024.06.22 |
(전공 정리)4강 - static, final, 오버로딩/오버라이딩, 상속, this, super, 메소드체이닝 (0) | 2024.06.22 |
(전공 정리) 2강 - 변수, 자료형, 연산자, 반복문, 제어문 (0) | 2024.06.22 |
자바 Servlet 기초 예제(doGet : 데이터 조회) (0) | 2023.08.31 |
JDBC 사용하기(Java + MySQL) 쿼리날려보자! (0) | 2023.07.27 |