25.02.19 (수) 8일차 Java

허배령·2025년 2월 19일

괴발개발 TIL

목록 보기
8/54

배열

2차원 배열

1차원 배열 : 변수를 하나의 묶음으로 다루는 것
2차원 배열 : 1차원 배열을 묶음으로 다루는 것
3차원 배열 : 2차원 배열을 묶음으로 다루는 것

1차원 배열의 묶음으로 배열 안에 다른 배열이 존재
2차원 배열은 할당된 공간마다 인덱스 번호 두 개 부여 (앞 번호는 행, 뒷 번호는 열 ([0][0]))

2차원 배열 선언과 할당

  • 배열 선언
    자료형[][] 배열명;
    자료형 배열명[][];
    자료형[] 배열명[];

  • 배열 할당
    자료형[][] 배열명 = new 자료형[행크기][열크기];
    자료형 배열명[][] = new 자료형[행크기][열크기];
    자료형[] 배열명[] = new 자료형[행크기][열크기];

ex)
int[][] arr = new int[3][4];
int arr[][] = new int[3][4];
  • 배열 구조

2차원 배열 초기화

  • 인덱스를 이용한 초기화
        arr[0][0] = 10;
		arr[0][1] = 20;
		arr[0][2] = 30;
		
		arr[1][0] = 40;
		arr[1][1] = 50;
		arr[1][2] = 60;
  • for문을 이용한 초기화
int num = 10; // 배열 요소 초기화에 사용할 변수
		
		// * 배열 길이
		System.out.println(arr.length);  // 2 (행 길이)
		// arr이 참조하고 있는 2차원 배열의 행의 길이 
		
		System.out.println(arr[0].length); // 3 (열 길이)
		// arr[0]이 참조하고 있는 배열의 길이     (메모리구조 pdf참고)
		
		System.out.println(arr[1].length); // 3 (열 길이)
		// arr[0]이 참조하고 있는 배열의 길이
		
		for(int row = 0; row < arr.length; row++) { // 행 반복 (0,1)
			
			for(int col = 0; col < arr[row].length; col++) { // 열 반복 (0,1,2)
				
				arr[row][col] = num;
				num += 10;
  • 선언과 동시에 초기화
int[][] arr2 = {{10, 20, 30}, {40, 50, 60}}; // 2행 3열
		
		// Arrays.toString(배열명) : 참조하고 있는 1차원 배열의 값을 문자열로 반환 (1행까지만 보여줌)
				System.out.println(Arrays.toString(arr));
				
				// Arrays.deepToString(배열명)
				// : 참조하고 있는 배열의 실제 데이터가 나오는 부분까지 파고 들어가서
				//   모든 값을 문자열로 반
				System.out.println(Arrays.deepToString(arr));
				System.out.println(Arrays.deepToString(arr2));

가변 배열

2차원 배열 생성 시 마지막 배열 차수(열)를 지정하지 않고 -> ([] 빈공간으로)
나중에 서로 크기가 다른 1차원 배열을 생성하여 참조하는 배열

char[][] arr = new char[4][];
		// char 2차원 배열 생성 시 행 부분만 생성
		
		arr[0] = new char[3]; // new char[4] -> 0행에 3열짜리 1차원 배열을 생성하여 주소값 저장
		arr[1] = new char[4]; // 1행에 4열짜리 1차원 배열을 생성하여 주소값 저장
		arr[2] = new char[5]; // 2행에 5열짜리 1차원 배열을 생성하여 주소값 저장
		arr[3] = new char[2]; // 3행에 2열짜리 1차원 배열을 생성하여 주소값 저장
		
		char ch = 'a';
		
		for(int row = 0; row < arr.length; row++) { // arr.length = 4
			
			for(int col = 0; col < arr[row].length; col++) {
				
				arr[row][col] = ch++;
			}
		}
		
		System.out.println(Arrays.deepToString(arr));
	}

OOP

객체 지향 언어

  1. 객체 (Object : 객체, 물건) : 독립적으로 각각 구분해서 인식할 수 있는 모든 것
    키보드, 김치, 옆집아저씨, 나 미세먼지, 모래한알, 판소리,
    무형문화제 (실체가 없어도 객체로 인정)

  2. 지향 : 어떤 것을 목표로 함
    객체 지향 : 독립적으로 각각 구분해서 인식할 수 있도록 하는 것을 목표로 한다 + 코딩방식

ex) 내(객체)가 문(객체)을 열었다(사건) -> 상호작용

  1. 현실에서 객체(Object)란?
    자신의 속성(값, data)기능(동작, 행동)이 다른 것들과 구분되어 식별 가능한 것
    속성 : 이름, 나이, 키, 몸무게, 생년월일 등 명사
    기능 : 밥을 먹는다, 잠을 잔다, 출근 한다, 퇴근 한다 등 동사

  2. 객체 지향 언어란?
    현실 세계는 사물이나 개념처럼 독립되고 구분되는 각각의 객체로 이루어져 있으며,
    발생하는 모든 사건들은 객체간의 상호작용이다.
    이 개념을 컴퓨터로 옮겨 놓아 만들어낸 것이 객체지향 언어이다.

  3. 자바에서 객체(Object)란?
    클래스에 정의된 내용대로 new 연산자를 통해 메모리 영역에 생성된 것

== 알아두기==
MVC 패턴 - => 애플리케이션의 역할을 세가지로 분리하는 설계 패턴

Model - 프로그램 로직과 관련되어 있는 데이터를 저장하는 용도 + 비즈니스 로직 (DB, 서비스, 객체)
vo( Value Obect) : 값 저장용 객체를 만들기 귀한 클래스를 모아두는 패키지

View - 사용자에게 보여지는 화면 (UI - HTML, JSP, Thymeleaf, React)
Controller - 사용자의 요청을 받고, 모델과 뷰를 연결하는 역할 (응답)

Service : 특정 기능(비즈니스 로직)을 제공하는 패키지
(비밀번호 -> 암호화 / 파일 -> 유효한 파일 걸러내는 작업)

===========

객체 지향 3 + 1대 특징

  1. 캡슐화 : 외부로부터 보호하기 위함

  2. 상속 : 공통된 코드만 작성
    ex) 김아빠 -> 김길동, 김춘자, 김삼순 -> 자녀 김씨를 없애고 이름만

  3. 다형성 : 다양한 형태를 지니는 성질
    ex) 메타몽, 김아빠가 길동이 될 수 있음...?

  4. 추상화 : 공통적으로 가지고 있는 속성

객체 지향 언어 - 클래스

클래스 (class)

객체의 특성(속성, 기능)에 대한 정의를 한 것
ex) 제품의 설계도, 빵 틀

속성 == 값 == data
값을 저장하기 위한 변수 선언
-> 국민이라면 공통적으로 가지고 있는 속성만 작성 (추상화를 해야함)
ex) 이름, 성별, 나이, 주민번호, 주소, 전화번호
필드 == 필드변수 == 멤버변수

  • 클래스를 이용하여 객체 만들기
People p1 = new People();

People p1 : People 객체의 주소를 저장하여 참조하는 변수 p1(== 참조변수)
new People() : 새로운 People 객체를 Heap 영역에 생성

* 클래스 이름이 자료형처럼 사용된다 *
== 그래서 클래스를 "사용자 정의 자료형" 이라고 부른다!

클래스 작성 시 반드시 필요한 것

추상화(abstraction), 캡슐화(encapsulation)이 적용되어야 함

객체 지향 언어 - 추상화

프로그램에서 필요한 공통점을 추출하고, 불필요한 부분을 제거하는 과정

ex) 국민 한 사람의 속성

객체 지향 언어 - 캡슐화

데이터(속성)와 기능을 하나로 묶어서 관리하는 기법
데이터의 직접적인 접근을 제한하는 것이 원칙이다
-> 직접접근 못하기 때문에 클래스 내부에서 간접접근 방법을 제공하는
기능(메서드)을 작성해둔다
-> getter / setter

=> 추상화를 통해서 정리된 속성과 기능을 하나로 묶고,
속성(데이터)의 직접 접근 방지를 하는 것.
이로 인해 부가적으로 정보 은닉 효과가 발생함.

캡슐화의 원칙

  1. 클래스의 멤버 변수에 대한 접근 권한은 private을 원칙으로 한다.
  2. 클래스의 멤버 변수에 대한 연산처리를 목적으로 하는 멤버 메소드는 클래스 내부에 작성한다.
  3. 멤버 메소드는 클래스 밖에서 접근할 수 있도록 public으로 설정한다.

*데이터 직접접근 제한
public (공공의) -> private (사적인, 개인적인) 변경

  • 직접적인 접근 방법 (캡슐화를 어긴 코드)
p1.name = "홍길동";
p1.gender = '남';
p1.pNum = "123456-1234567";

System.out.println("p1의 name : " + p1.name);
System.out.println("p1의 gender : " + p1.gender);
System.out.println("p1의 pNum : " + p1.pNum);

캡슐화에서 간접접근 기능

[접근제한자] 반환명 메서드명(){}

public String getpNum() {  // pNum 변수의 값을 호출한 쪽으로 반환하게 해주는 기능
		return pNum; 
        // return 값/변수; : 현재 메서드를 종료하고 
		//                  값/변수 가지고 호출한 쪽으로 되돌아감
        
	}
	public void setpNum(String pNum) {
		this.pNum = pNum;
	}
                ↓
                
p1.setpNum("123456-1234567");

System.out.println(p1.getpNum());

/* getter() : 반환형이 무조건 있음
              getter는 필드에 작성된 변수값을 호출한 쪽으로 되돌려주는 것
			  변수는 자료형이 있을 것
	 		  그 변수를 되돌려준다면 당연히 반환형도 존재할 것!
              

getter/setter 단축키!!

  • alt + shift + s 또는 상단 Source
    -> Generate getters and setters

"미리 알아두기!!"
메서드(기능) 형태인 getter/setter를 이용하면 본인이 원하는 기능을 추가할 수 있음
age가 0보다 작을 때 예외 발생시키기
age가 0보다 클 때 속성에 전달받은 값 세팅하기

   if(age > 0) {
     this.age = age;
     } else {
         throw new IllegalArgumentException("음수는 안됨");
        // IllegalArgumentException 
		// 메서드에 전달된 인자가(매개변수)유효하지 않을 때 발생하는 예외

흐름도

public class Person {
    private String name; // 1. private 변수 선언

    // 3. Getter 메서드 (값 읽기)
    public String getName() {
        return name;
    }

    // 2. Setter 메서드 (값 저장)
    public void setName(String name) {
        this.name = name;
    }

    public static void main(String[] args) {
        Person p1 = new Person();  // 객체 생성
        p1.setName("홍길동");       // 4. Setter로 값 저장
        System.out.println(p1.getName()); // 5. Getter로 값 가져와 출력
    }
}
profile
인생은 변수

0개의 댓글