* 이 글은 제가 공부하기 위해 최대한 사실에 입각해 내용을 적으려고 하지만 일부 내용들이 정확하지 않을 수 있습니다.
혹시나 잘못된 부분이 있으면 너그럽게 이해해주시고 피드백 부탁드려요!
2023.01.16 - [공부/풀스택 과정] - [풀스택과정] JAVA 7장 클래스
연습 프로그램(카드 섞기 및 뽑기)
package chapter07;
public class Card {
// 숫자, 무늬, 너비, 높이
// 숫자, 무늬 : 인스턴수 변수
// 너비, 높이 : static
String number; // A~K
int kind; // 0 클로버 1 하트 2 다이아 3 스페이드
// 스페이드:검 다이아 : 돈 하트:생명, 클로버 :농민
static int width = 80;
static int height = 200;
public String toString() {
String[] kinds = {"클로버", "하트","다이아","스페이드"};
return number+ " " + kinds[kind];
}
}
package chapter07;
public class CardEx {
public static void main(String[] args) {
// Card card = new Card();
// card.number = "A";
// card.kind = 3;
// System.out.println(card);
Deck deck = new Deck();
for(Card c : deck.cards) {
System.out.println(c);
}
deck.shuffle();
Card c = deck.pick();
System.out.println(c);
System.out.println(deck.cards[0]);
// 캡슐화의 시작
// 메서드 : 수단 혹은 방법
// 메서드 : 특정 객체의 프로퍼티에 접근하는 방법
// 변수의 접근이 필요하다면 메서드를 활용하여...
System.out.println(new Deck().pick()); // 인스턴스를 통해 실행
deck.pick(53);
}
}
package chapter07;
public class Deck {
Card[] cards;
{
cards = new Card[52];
String numbers = "A23456789XJQK"; // 13
int cnt = 0;
for(int j = 0 ; j < 4; j++) { // 4
for(int i =0; i<numbers.length();i++) { // 13
cards[cnt] = new Card(); // 52칸안에 null, 0값이 배정, 공간확보
cards[cnt].number = numbers.charAt(i) + ""; // char at 특정 위치에있던 데로 가져와라 + "" 문자열로 형변환
cards[cnt].kind = j;
cnt++;
}
}
}
void shuffle() {
for(int i=0;i<cards.length;i++) {
int rand = (int)(Math.random() * 52);
Card tmp = cards[rand];
cards[rand] = cards[i];
cards[i] = tmp;
}
}
Card pick() { // void가 없는 경우 반환값이 있기 때문
return cards[0];
}
Card pick(int idx) {
if(idx < 0 || idx > 51 ) {
return null;
}
return cards[idx];
}
}
카드
한장이 객체 하나
한벌이 52장 (13개씩 숫자 혹은 글자가 네종류의 문자가 있어서)
기능 구현?
카드 정보 : 카드라는 클래스, 덱이라는 클래스
덱 필드 : 카드 배열이 있으면 ...
섞는 기능, 픽 기능은 덱이 가지고 있어야함.
카드 필드 : 숫자 혹은 문자
4종류 무늬
메서드의 실행순서
stack의 구조, stack의 실행
가장 나중에 들어온 데이터가 가장 먼저 출력되는 자료구자(Last In First Out)
package chapter07;
public class MethodOrder {
public static void main(String[] args) {
System.out.println("main() start");
MethodEx me = new MethodEx();
me.one(); // 메서드 실행
System.out.println("main() end");
}
}
class MethodEx {
void one() { // 1
System.out.println("one() start");
two();
System.out.println("one() end");
}
void two() { // 2.
System.out.println("two() start");
three();
System.out.println("two() end");
}
void three() { // 3.
System.out.println("three() start");
System.out.println("three() end");
}
}
메서드 오버로딩
클래스 내에서 이름이 같은 메서드가 여러 개 있을 수 있는데 이것을 오버로딩(overloading)이라고 한다. 같은 이름을 가진 메서드이면서 매개 변수의 자료형, 매개변수의 개수, 순서 중 하나 이상이 달라야한다. 메서드 오버로딩이 필요한 이유는 매개변수를 다양하게 입력받게 하기 위함이다.
package chapter07;
public class Overloding2 {
public static void main(String[] args) {
System.out.println(1);
System.out.println(5.5);
System.out.println(5.5f);
System.out.println((long)100);
System.out.println("홍길동");
System.out.println('a');
System.out.println(true);
System.out.println(new Overloding2());
System.out.println(new int[] {1,2,3,4,5});
System.out.println(new char[] {65,66,97,'가','c', '\uac00'});
}
}
7.6 생성자
생성자(Constructor)는 new 연산자와 함께 객체를 생성할 때 사용한다. 클래스 이름과 생성자 이름이 동일해야 하고, 리턴값이 없어서, 리턴 타입을 아예 적어주지 않는다. 생성자의 용도는 객체의 초기화 목적이다.
생성자명이 곧 클래스명이다. 생성자도 매개변수가 있을 수도 있고, 없을 수도 있다.
기본생성자
모든 클래스는 생성자가 반드시 하나 이상 존재한다.
Member member = new Member(); |
new 연산자 뒤의 Member()가 바로 기본 생성자이다.
변수 초기화
생성자의 용도는 객체를 생성할 때 초기화하는 목적이다.
7.7 this
같은 클래스의 메서드를 실행할 수 있는 것처럼 생성자 간에도 서로 실행이 가능하다. 이 때 생성자명 대신 this라는 키워드를 사용한다.
이 때 생성자명 대신 this라는 키워드를 사용한다. 주의할 점은 다른 생성자를 실행할 때는 반드시 첫줄에서 실행해야한다.
this 키워드가 사용되는 또 하나는 참조변수로서의 객체 자기 자신을 가리킨다. 객체 외부에서 객체 내부의 멤버에 접근하기 위해 객체변수(참조변수)를 사용하듯이 객체 내부에서도 객체의 멤버에 접근하기 위해 this 키워드를 사용한다.
package chapter07;
public class This {
int i; // 전역이라고 알수있는 정도, 전역은 자바에서 없음
// 지역변수는 반드시 메서드 안에서만
public This() {
// TODO Auto-generated constructor stub
// int a; // 지역변수
// int a;
int i = 10; // 지역
System.out.println(i); // <- 인스턴스 i를 가리킴
}
public This(int i) {
// 지역변수랑 파라미터의 차이점?
// int i;
this.i = i; // 파랑색은 파라미터, 지역변수 this
}
void printThis() { // 인스턴스 메서드
System.out.println(this);
}
This getThis() { // 인스턴스 메서드, 인스턴스변수가 필요함
return this;
}
public static void main(String[] args) {
This this1 = new This(); // 주소
System.out.println(this1); // 결과 : chapter07.This@372f7a8d 챕터7폴더 안에.주소
// 자바는 주소를 제어 안한다. 주소를 제어하려면 c 이상의 언어
// 자바의 주소 목적 : 다른 객체랑 같은 값인지만 비교하려고 쓰인다.
this1.printThis(); // 위랑 같은 값이 나옴.
This this2 = new This(10);
this2.printThis();
System.out.println(this2);
This this3 = new This(20);
System.out.println(this3);
}
}
package chapter07;
public class Car2 {
// 필드
String color;
String company;
String type;
Car2() {
this("white", "기아", "경차");
System.out.println(0);
}
Car2(String color, String company, String type) {
this.color = color;
this.company = company;
this.type = type;
System.out.println(3);
}
Car2(String com, String t) {
this("white", com, t);
System.out.println(2);
}
Car2(String t) {
this("white", "기아", t);
System.out.println(1);
}
public String toString() {
return color + "-" + company + "-" + type;
}
}
package chapter07;
public class Car2Main {
public static void main(String[] args) {
Car2 c1 = new Car2();
System.out.println("c1 = " +c1);
Car2 c2 = new Car2("중형차");
System.out.println("c2 = " +c2);
Car2 c3 = new Car2("현대", "대형차");
System.out.println("c3 = " +c3);
Car2 c4 = new Car2("black","기아","화물차");
System.out.println("c4 = " +c4);
}
}
// 생성자의 첫줄은 this or super 밖에 못온다.
// super는 조상님 인스턴스
// this는 본인
// this를 쓰면 super는 못옴
package chapter07;
public class CircleTest {
public static void main(String[] args) {
new Circle(3).area().cir().setR(5).area().setR(10).cir();
// 체이닝 : this 키워드를 활용해서 쓸수 있는 기능
}
}
class Circle {
// 반지름 r
double r; // 필드
public Circle(double r) {
this.r = r;
}
// 넓이 파이 r^2
Circle area() { // 메서드
System.out.println(3.14 * r * r);
return this;
}
// 둘레 2파이r
Circle cir() { // 메서드
System.out.println(2 * 3.14 * r);
return this;
}
Circle setR(double r) {
this.r = r;
return this;
}
}
7.8 초기화 블록
초기화 블록은 static 초기화 블록과 인스턴스 초기화 블록이 있는데, static 초기화 블록은 클래스가 메모리에 로드될 때 한번만 실행된다. 인스턴스 초기화 블록은 객체가 생성될 때마다 실행되는 블록이다. 초기화 블록은 이름 그대로 클래스를 초기화 할 때 사용한다.
앞에서도 생성자도 초기화 용도로 사용된다고 했는데, 초기화 블록은 생성자보다도 먼저 실행된다.
static 초기화 블록은 주로 클래스 변수(static 변수)의 초기화 목적으로 많이 사용하고, 인스턴스 초기화 블록은 인스턴스 변수의 초기화를 주로 담당한다. 하지만 생성자도 인스턴스 변수의 초기화로 많이 사용되기 때문에 인스턴스 블록은 자주 사용하지 않는 편이다.
package chapter07;
//import java.util.Arrays; // ctrl + shift + o
//import java.util.Date;
import java.util.*; // util 안에 있는 클래스 다., 단 그 밑에 패키지는 안 가지고 온다.
import java.util.concurrent.*; // 그래서 추가해줘야함.
//import student.Student;
public class intEx {
// 1. arr이라는 이름을 가지는 int 타입의 일차원 배열을 생성,10개의 공간으로 초기화, 클래스 변수
// 2. 10개의 공간의 임의의 숫자를 배정해서 초기화, 단 0~100 사이의 5의 배수로 지정
// 1.
static int[] arr = new int[10]; // 클래스 변수
Date date; // java.util.Date
java.sql.Date d2; // java.sql.Date
// java.lang 패키지는 자동 import, 중요 클래스들의 집합
// { // 앞에 static 붙이면 static초기화 블록이기 때문에 메인 메서드 선언된 인스턴스 없어도 됨
// // 어떤 장난질을 해도 안보임.
// for(int i=0; i <arr.length; i++) {
// arr[i] = (int)(Math.random() * 21) * 5;
//
// }
//
// }
//
// public static void main(String[] args) {
// new intEx();
// System.out.println(Arrays.toString(arr));
// new intEx();
// System.out.println(Arrays.toString(arr));
//
// }
//
// }
static{ // 앞에 static 붙이면 static초기화 블록이기 때문에 메인 메서드 선언된 인스턴스 없어도 됨
// 어떤 장난질을 해도 안보임.
for(int i=0; i <arr.length; i++) {
arr[i] = (int)(Math.random() * 9) * 5 + 60; // 60~100 =>9
}
} // 결과값이 같음.
//클래스 초기화 블럭은 클래스가 메모리에 로드될때
public static void main(String[] args) {
new intEx();
System.out.println(Arrays.toString(arr));
new intEx();
System.out.println(Arrays.toString(arr));
// Student.main(null);
}
}
//
// for(int i=0; i<arr.length; i++) {
// arr[i] = Math.random()
// if(arr[i])
// }
//
// intEx() {
// int[] arr = new intEx[10];
// }
// // int[] arr;
// intEx(int i) {
// int[] arr = new ;
// }
7.9 패키지
패키지는 폴더라고 생각하면 쉽게 이해할 수 있다. 원래 클래스의 이름은 패키지명까지 포함된다. 그래서 클래스의 이름을 식별하기 위한 식별자이기도 하다. 즉, 클래스명이 같아도 패키지명이 다르면 (다른 폴더에 있으면) 다른 클래스이다.
패키지를 상위, 하위로 구분하기 위한 기호는 도트(.)을 사용해서 다음과 같이 표현한다.
상위 패키지.하위패키지.클래스명 => java.lang.String |
패키지 이름을 작성하는 규칙
* 숫자로 시작할 수 없고, _,$ 외 특수문자 사용불가
* 관례적으로 소문자로 작성
* 회사에서는 회사(도메인)으로 많이 사용
- 도메인은 역순으로 사용 => com.naver
* 패키지명은 명사형
* 굳이 단어사이 구분 카멜형태로 안쓰고 하위 패키지로 만드는게 좋음
import
프로그램 작성 시 패키지명을 생략 가능한 겨우는 아래 세가지
1. 작성 중인 클래스와 사용하고자 하는 클래스가 같은 패키지에 존재하는 경우
2. 상단 import 구문에 정의되어 있는 경우
3. java.lang 패키지에 있는 클래스를 사용하는 경우
위 3가지 조건에 해당되지 않는 경우 이클립스는 에러를 표시해주는데, 이 때 Ctrl + Shift + O를 누르면 자동으로 import를 해준다.
7.10 접근제한자
접근제한자의 종류는 public, protected, default, private 네 종류가 있다.
public이 가장 넓은 범위로 순서는 public ➡️ protected ➡️ default ➡️ private 순이다.
public은 단어 그대로 공용의 의미이다. 아무나, 어디에서든 사용가능하다는 의미이다.
protected는 같은 패키지이거나, 뒤에서 배울 상속관계의 클래스에서 사용가능하고,
default는 같은 패키지에서만 사용가능하다.
private는 개인적인 의미로 같은 클래스 내에서만 사용가능하다.
접근제한자 | 접근 제한 범위 | |||
모든 클래스 | 상속관계 | 동일패키지 | 동일클래스 | |
public | O | O | O | O |
protected | X | O | O | O |
(default) | X | X | O | O |
private | X | X | X | O |
public은 공용이라는 뜻이므로 아무데서나 다 사용할 수 있고, private은 반대로 개인적인 것이기 때문에 해당클래스 내부에서만 사용할 수 있도록 개인화하는 것이다. default를 괄호로 표기한 이유는 접근제한자를 아무것도 적지 않는 경우를 말한다. 반대로 얘기하면 접근제한자가 없으면 default 접근 제한자라는 얘기이다.
접근제한자를 사용할 수 있는 곳은 클래스, 메서드/생성자, 변수에 모두 사용할 수 있는데 이중 파일 이름으로 만들어진 클래스는 public과 default만 사용 가능하다.
7.11 싱글톤
특정 클래스는 하나의 객체만 생성되도록 하는 프로그래밍하는 기법이 있는데, 이를 싱클톤 기법, 이 객체를 싱글톤 객체라고 부른다. 이렇게 클래스가 객체를 생성하는 방법을 별도로 정의하는 것을 디자인 패턴(Design Patter)이라고 한다.
7.12 Final
final 변수는 마지막 변수라는 뜻이다. 다른 값으로 변경할 수 없다는 뜻이다. final 키워드는 클래스, 메서드, 변수 앞에 붙일 수 있다.
final 클래스
마지막 클래스로 상속이 불가능한 클래스 이다.
대표적인 final 클래스는 String, Math가 있다.
final 메서드
마지막 메서드로 재정의가 불가능한(오버라이딩) 메서드이다. 상속관계에서 자식은 부모의 메서드를 재정의(변경)할 수 있는데 final이 붙은 메서드는 변경할 수 없다.
final 변수, 상수
마지막 변수, 값이 변경되지 않는 변수이다. final 변수는 초기값을 지정한 후 변경할 수 없는데 생성자에서 초기화하는 경우 변경이 가능하다.
상수(static final)
상수란 항상 같은 수이다. 원주율처럼 이미 고정된 값은 변하지도 않고, 변하면 안되는 것이다. 이를 상수라고 부르며, 모든 곳에서 공유되어야하는 값이다. 그래서 공유되기 위해 static을 마지막이기 때문에 final을 붙여 static final을 함께 쓴다. 인스턴스 블록에서도 초기값을 지정할 수는 있지만, 보통은 선언할 때 초기값을 지정해준다. 그리고 상수는 관례적으로 변수명을 모두 대문자로 사용한다. 만약 두 단어 이상으로 연결된 경우 단어와 단어 사이를 _로 구분한다.
javadoc
javadoc은 주석과 유사하게 작성하며, 문서화 작업을 통해 다양한 포맷으로 출력할 수 있는 기능이다. 클래스나 필드, 메서드 등에 대한 설명문구를 작성하여 문서화 해서, 코드 유지보수나 관리를 위해 사용된다.
'Full Stack > JAVA' 카테고리의 다른 글
[풀스택과정] JAVA 8장 상속 (1) | 2023.01.19 |
---|---|
[풀스택과정] JAVA 7장 연습문제 (1) | 2023.01.18 |
[풀스택과정] JAVA 7장 클래스(2) (1) | 2023.01.16 |
[풀스택과정] JAVA 연습문제/코딩테스트(연산자, 제어문, 배열) (1) | 2023.01.14 |
[풀스택과정] JAVA 6장 배열, 7장 클래스(1) (0) | 2023.01.13 |