Day10

dokiru·2023년 2월 13일
0

학원

목록 보기
8/51

종합문제 피드백
1. 인덱스 안에 바로 증감 연산자 써도됨

아래 두 코드는 같은 코드이다
1. 
if(!isOverlapped) {
lotto[idx] = randomNum;
idx++;
}

=

if(!isOverlapped) {
lotto[idx++] = randomNum; // 저장 이후에 증가 됨
}
  1. 반복문을 몇번 실행해야할지 알 때 => for
    몇번 실행해야하는지 모를 때 => while

  2. 1 2 2 2 2
    3 1 2 2 2
    3 3 1 2 2
    3 3 3 1 2
    3 3 3 3 1 출력하기

인덱스로만 보면
(0,0) (0, 1) ... (0,4)
(1,0) (1, 1) ... (1,4)
(2,0) (2,1) (2,2) ... (2,4)

int[][] newArr = new int[5][5];
for (int i = 0; i<5; i++){
	for (int j = 0; j<5; j++) {
    	if (i == j) { // 만약 i랑 j랑 같으면
        	newArr[i][j] = 1;
        } else if (j > i) { // j가 i보다 크면
        	newArr[i][j] = 2;
        } else { // j가 i보다 작으면
        	newArr[i][j] = 3;
        }
    }
}

for (int i =0; i<5; i++) {
		for (int j=0; j<5; j++){
		    System.out.print(newArr2[i][j] + " ");
		 }
		System.out.println();
}

// 결과 
1 2 2 2 2
3 1 2 2 2
3 3 1 2 2
3 3 3 1 2
3 3 3 3 1

객체란?

  • 물리적으로 존재하는 것
  • 추상적인 것 중에서 자신의 속성과 동작을 가지는 모든 것
  • 필드(속성)과 메소드(동작)으로 구성된 자바 객체

ex.
[현실세계]
사람 - 사람 객체
[속성] 이름, 나이 [필드] 이름, 나이
[동작] 웃다, 먹다 -> [메서드] 웃다, 먹다

자동차 - 자동차 객체
[속성] 색깔, 속도 -> [필드] 색깔, 속도
[동작] 달린다, 멈춘다 [메서드] 달린다, 멈춘다

  • 객체들은 서로 간에 기능(동작)을 이용하고 데이터를 주고 받음
  • 리턴 : 메소드가 실행하고 나서 호출한 곳으로 돌려주는 값

객체 간의 관계

  • 집합 관계 : 완성품과 부품의 관계 ex. 자동차 객체와 엔진객체 타이어객체
  • 사용 관계 : ex. 사람객체가 자동차 객체 사용
  • 상속 관계 : 종류 객체와 구체적인 사물 객체 관계 ex. 자동차객체와 기계 객체

객체 지향 프로그래밍의 특징
1. 캡슐화 : 객체의 필드, 메소드를 하나로 묶고 실제 구현 내용을 감추는 것을 말한다. 외부 객체는 객체가 노출해서 제공하는 필드와 메소드만 이용할 수 있다. 접근 제한자(ex. Publie, Private)를 통해 공개 여부를 정할 수 있다.

  1. 상속 : 하위 객체에게 상위 객체가 가진 필드와 메소드를 물려주는 것을 말한다. 객체를 재사용해서 쉽고 빠른 설계가 가능하게 하고 반복된 코드의 중복을 줄여준다는 장점이 있다.

  2. 다형성 : 하나의 타입에 여러 객체를 대입함으로써 다양한 기능을 이용할 수 있도록 해준다. 부모 타입에는 모든 자식 객체가 대입될 수 있고, 인터페이스 타입에는 모든 구현 객체가 대입될 수 있다.
    ex. 타이어 인터페이스 타입 적용했다면 어떤 타이어가 와도 대입 가능, 핸드폰에 여러 종류의 케이스

객체와 클래스
현실세계 : 설계도 -> 객체
자바 : 클래스 -> 객체

클래스에는 객체를 생성하기 위한 필드와 메소드가 정의되어 있고 이 클래스로부터 만들어진 객체를 해당 클래스의 인스턴스라고 한다. 하나의 클래스로 여러 개의 인스턴스를 만들 수 있다.
ex. 하나의 설계도로 여러 대의 자동차

클래스 선언
변수 이름 -> 자바 식별자 작성 규칙을 따른다.

번호작성규칙예시
1하나 이상의 문자로 이루어져야 한다Car, SportsCar
2첫 번째 글자는 숫자가 올 수 없다Car, 3Car(x)
3'&', '_' 외의 특수 문자는 사용할 수 없다$Car, _Car, @Car(x), #Car(x)
4자바 키워드는 사용할 수 없다int(x), for(x)

+) 단일 단어라면 첫 자를 대문자, 단어가 혼합되어 있다면 각 단어의 첫머리 글자는 대문자

+) 소스 파일 하나당 두개 이상의 클래스 선언도 가능하지만, 파일 이름과 동일한 이름의 클래스 선언에만 public 접근 제한자를 붙일 수 있다. 가급적이면 소스 파일 하나당 동일한 이름의 클래스 하나를 선언하는 것이 좋다

클래스와 객체 선언
new 연산자 사용

클래스 변수;
변수 = new 클래스(); // 힙 영역에 생성, 객체의 주소 리턴

클래스 변수 = new 클래스();

ex.

public class Student {
}


public class StudentExample {
	public static void main(String[] args){
    	Student s1 = new Student();
    	System.out.println("s1 변수가 Student 객체를 참조합니다.");
    
    	Student s2 = new Student();
    	System.out.println("s2 변수가 Student 객체를 참조합니다.");
    }
}

// s1이 참조하는 객체와 s2가 참조하는 객체는 다르다.

클래스의 용도
1. 라이브러리(API)용 - 다른 클래스에서 이용할 목적으로 설계 ex. Student
2. 실행용 - 프로그램의 실행 진입점인 main() 메소드를 제공하는 역할 ex. StudentExample
라이브러리인 동시에 실행 클래스로 만들 수도 있다

  • 1개의 애플리케이션 = (1개의 실행클래스) + (n개의 라이브러리 클래스)
  • 대부분의 객체 지향 프로그램은 라이브러리와 실행 클래스가 분리되어 있다

클래스의 구성 // 생략되거나 복수개가 작성될 수 있다.

public Class Person {
 // 필드
 String name;
 
 // 생성자
 Person() {
 }
 
 // 메소드
 printName();
 
}
  1. 필드(Field) : 고유 데이터, 부품 객체, 상태 정보를 저장하는 곳 / 생성자와 메소드 내에서만 사용됨 / 초기값은 선언 시 주어질 수도 있고 생략될 수도 있음
  • 필드 초기값
분류데이터 타입초기값
byte0
charu0000(빈 공백)
정수타입short0
기본타입int0
long0L
실수타입float0.0F
double0
논리타입booleanfalse
배열null
참조타입클래스(String포함)null
인터페이스null
  • 필드의 사용
    클래스 내부 : 변수 이름
    클래스 외부 : 클래스로부터 객체 생성한 후에 도트 연산자 (객체.변수이름)
Car myCar = new Car();
System.out.println(myCar.maxspeed); // 필드값 읽기
myCar.maxSpeed = 60; // 필드값 변경
  1. 생성자(Constructor) : 객체 생성시 초기화역할 담당
  • 모든 클래스는 생성자가 반드시 존재하고, 생략하면 컴파일러가 기본 생성자를 추가한다. (명시적으로 선언한 생성자가 한 개라도 있으면 컴파일러는 기본 생성자 추가 X)
  • 명시적으로 생성자를 선언하는 이유는 객체를 다양하게 초기화하기 위해
  • new 연산자가 성공적으로 수행되면 heap영역에 객체 생성, 객체 주소 리턴

생성자 선언

클래스 (매개변수 선언, ...) {
	// 객체의 초기화 코드
}

필드의 초기화
1. 필드 선언할 때 초기값 주는 것
2. 생성자에서 초기값 주는 것

public class Korean {
	String nation = "대한민국";
    String name;
    String ssn;
}

Korean k1 = new Korean();
Korean k2 = new Korean();

// k1과 k2의 필드값이 같다
// k1과 k2의 주소는 서로 다르다
  • 객체 생성 시점에 외부에서 제공되는 다양한 값들로 초기화되어야 하면 매개변수 선언해서 넣어줘야 함

public class Korean {
	String nation = "대한민국";
    String name;
    String ssn;
    
    public Korean(String n, String s) {
    name = n;
    ssn = s;
    }
}

Korean k1 = new Korean("박자바", "011225-1234567);
Korean k2 = new Korean("김자바", "930525-0654321);
  • 관례적으로 필드와 동일한 이름을 갖는 매개 변수를 사용하는데, 생성자 내부에서 동일한 이름의 매개 변수가 우선순위가 더 높기 때문에 해당 필드에 접근할수가 없다. 이 때 객체 자신을 가리키는 말인 this 를 쓴다
public Korean(String name, Stromg ssn) {
	this.name = name;
    this.ssn = ssn;
}
  • 생성자 오버로딩 : 매개변수를 달리하는 생성자를 여러 개 선언. 다양한 방법으로 객체를 생성할 수 있음. (매개변수 타입, 개수, 순서가 똑같고 이름만 바꾸는 것은 오버로딩이라고 할 수 없음)
public class Person {

	String name;
    String age;
    
	//생성자 오버로딩(Overloading)
	Person(){ //기본생성자 매개변수X
	}
	
	//생성자
	Person(String name, int age){ //매개변수 이름, 나이 둘다
		this.name = name; 
		this.age = age;
	}
	
	Person(String _name){ //매개변수 이름만
		name = _name; 
		age = 1;
	}
	
	Person(int age){ //매개변수 나이만
		this.age = age;
		name = "이름없음";
	}
}
  1. 메소드(Method) : 객체의 동작에 해당하는 실행 블록. 외부로부터 매개값을 받을 수도 있고, 실행 후 어떤 값을 리턴할 수도 있다
powerOn() {..} // 리턴값이 없는 경우 단순하게 메서드만 수행하면 됨
double result = divide(10, 20); // 리턴값이 double인 경우
  • 메소드 이름
  1. 숫자로 시작하면 안되고, '$', '_'를 제외한 특수 문자를 사용하지 말아야 한다.
  2. 관례적으로 메소드명은 소문자로 작성한다.
  3. 서로 다른 단어가 혼합된 경우라면 각 단어의 첫글자는 대문자
  • 리턴 타입이 있다고 해서 반드시 변수에 값을 저장할 필요는 없고 리턴 값을 호출한 곳에서 사용해야할 경우 변수에 저장
double divide(int x, int y){...}
double result = divide(10, 20); // 매개 변수가 int타입이면 매개값에는 int나 int로 변환될 수 있는 값을 넘겨주어야한다.

byte b1 = 10;
byte b2 = 20;

double result = divide(10.5, 20.5) // 에러
double result2 = divide(b1, b2); // byte는 int로 변환 가능. 에러 발생 X
profile
안녕하세요!

0개의 댓글