java study #1 class

김태준·2023년 6월 21일
0

java Study

목록 보기
1/3
post-thumbnail

작년 12월부터 매주 진행해왔던 스터디 모임.
약 6개월 간 CS, OS, Network에 이어 이번주차부터 진행할 스터디는 java!

java를 공부하는 이유는 단순하다. 현 시점 취업할 수 있는 분야 중 대기업들은 SI가 존재하는데 SI 기업들은 대체로 과거부터 사용해온 C#이라든지 무거운 C#을 보완하고 유동성을 높이고자 도입한 java를 사용한다. 또한 현재 데이터 엔지니어링 부캠을 수강하면서 웹 개발 쪽에 대한 나름의 경험을 접하며 (kafka라든지,, Cloud function 등)java의 필요성을 느끼게 되었다.

java는 객체 지향 프로그래밍 언어이자 SW 플랫폼으로 C언어 기반 규칙과 구문이 존재한다.

작동방식은 다음과 같다.

  • java는 프로그래밍 언어와 SW 플랫폼으로 구성된 기술
  • java 기반 애플리케이션 개발을 위해 JDK(java development kit)를 다운받아야 한다.
  • java프로그래밍 언어로 프로그램 제작 시 런타임 환경 (JRE)의 일부인 jvm으로 변환.

java가 왜 중요한지?

  • 현 시점 파이썬의 간편한 코드 작성으로 많은 변화가 개발 분야에서 이루어지고 있다고 하지만, 여전히 java에 대한 수요는 전세계적으로 높다.
  • 특히 java는 모든 산업에서 디지털 비즈니스 기반이 되는 애플리케이션 개발을 위한 이상적인 프레임웤이다.

✅ class, object

자바는 객체 프로그래밍 언어라고 하는데, 아래 계산기 예제 코드를 통해 클래스와 객체 개념에 대해 살펴보자.

class Calculator() {
	int result = 0;
    
    int add(int num) {
    	result += num
        return result
    }
}

public class Sample {
	public static void main(String[] args) {
    	Calculator cal1 = new Calculator(); // 계산기 객체 생성
        Calculator cal2 = new Calculator(); // 계산기 객체 생성
        
        System.out.println(cal1.add(3));
        System.out.println(cal1.add(4));
        
        System.out.println(cal2.add(5));
        System.out.println(cal2.add(7));
    }
}

// 결과
3
7
5
12

위 코드로 보아 특징은 다음과 같다.

  • Calculator 클래스 내 중괄호로 들어갈 내용들을 들어쓰기 이후 작성해준다.
  • 출력문은 System.out.println();
  • public static void main(String[] args)을 통해 어느 곳에서든 해당 객체 참조 가능토록 설정, static은 해당 함수가 정적인 함수를 의미하도록 저장, void는 리턴 X, String[] args는 연속적인 문자열 데이터가 들어가는 저장공간을 의미
  • 빼기 기능 추가하고 싶다면, Calculator 클래스 내부에 아래 코드 추가
	int sub(int num) {
    	result -= num
        return result;
    }    

이처럼 자바 코드들을 살펴보면 파이썬과 다른점들이 많다.
1. 해당 변수의 데이터 타입을 선언해준다.
2. 출력문이 다르다.
3. 메인 메소드를 저장함으로써 return 없도록 지정한다.
4. 등등등..

✅ type

앞서 본 것처럼 java는 변수 선언 시 데이터 타입도 선언을 해야한다.

🎈 1. 기본형 (primitive type)

  • 논리형 : boolean (1 byte)
  • 문자형 : char (2 byte)
  • 정수형 : byte (1 byte), short(2 byte), long(8 byte), int(4 byte)
  • 실수형 : double(8 byte), float(4 byte)

🎈 2. Constant & literal

  • 상수 : final int MAX_WEIGHT = 1000;
    상수는 선언과 동시에 바로 초기화해야 하며 이후 상수 값 변경 허용 X
  • 리터럴 : 유저가 사용하는 값 자체를 의미로 종류로는 다음과 같다.
  1. variable : 하나의 값 저장하기 위한 공간
  2. constant : 값을 한 번만 저장할 수 있는 공간, 자바에서는 final로 선언
  3. literal : 그 자체로 값을 의미하는 것

🎈 3. printf()

화면에 값을 출력하는 방법 중 하나로 앞서 본 System.out.println과의 차이는 변수 값을 그대로 출력하지 않고 다른 형식으로 출력한다. (파이썬에서는 format함수느낌)
예제는 다음과 같다.

int age = 14;
System.out.printf("age: %d", age);
// age: 14

System.out.printf("age: %d", 14);
// age: 14

가운데 들어갈 지시자 정보는 다음과 같다.
%b: boolean
%d: decimal integer
%o: octal integer
%x, %X: hexadecimal integer
%f: decimal float
%e, %E: exponent
%c: character
%s: string

🎈 4. Scanner

화면에 출력하는 것이 아닌 입력받는 방법으로는 Scanner 클래스 사용이 있다.
아래 예제를 살펴보자.

// Scanner 클래스를 사용하기 위해 추가한다.
import java.util.*; 
// Scanner 객체 생성
Scanner scanner = new Scanner(System.in); 
// 입력받은 내용을 input에 저장. 값을 입력하고 enter 키를 누르면 값이 입력된다.
String input = scanner.nextLine(); 
// 입력받은 내용을 int 형식으로 변환
int num = Integer.parseInt(input); 

✅ class - Inheritance

자바에는 상속이란 개념이 존재한다.
쉽게 설명하면 부모클래스(상위)와 자식클래스(하위)가 존재하며 자식클래스는 부모클래스를 선택해 해당 상위클래스의 멤버를 상속받아 그대로 사용할 수 있다.

상속을 하는 이유는 이미 마련된 클래스를 재사용한다는 것에 의미가 있다. 이미 생성한 클래스를 재사용함으로써 효율성을 높일 수 있고 개발 시간을 줄여주는 효과가 있다.

단, 상속을 하더라도 하위클래스가 상위클래스의 모든 것을 물려받는 것은 아니다.

  • 부모 클래스의 private 접근 제한을 갖는 필드, 메소드에 대해 상속 X
  • 상위, 하위클래스가 상이한 패키지에 존재하는 경우 상위의 default 접근 제한을 갖는 필드, 메소드도 자식이 물려받을 수 없다.

🎈 class 상속

상속방식은 다음과 같다.

  • 상속받고자 하는 하위클래스 이름 앞에 extends 키워드를 붙여 상속할 상위클래스 이름을 적는다.
  • 자바에선 다중 상속을 허용하지 않으므로 extends 뒤에 하나의 상위클래스만 와야 한다.
    아래 예시코드로 클래스 상속을 살펴보자
// 방법 1. 하위클래스가 상위클래스의 필드와 메소드 모두 그대로 상속받는 case
// 상위클래스 생성 후 하위클래스 생성

// 상위클래스 생성 - 명시적 생성자 선언 X
public class ParentBookstore{
	String name;
    int price;
// 메소드 생성
public void Print() { 
	System.out.println("책 이름과 가격은? : "+name+" "+price+");
}


// 하위클래스 생성
public class ChildBookstore extends ParentBookstore{
	// 생성자 생성
    ChildBookstore (String name, int price) {
    	// 하위클래스가 상위클래스 필드 상속 받아 가능한 선언들
        this.name = name;
        this.price = price;
}

public static void main (String[] args) {
	// 명시적 생성자 선언 (new CLASS-NAME)
	ChildBookstore Child = new ChildBookstore("역행자", 19800);
    System.out.println("[구현 결과 1] ");
    Child.print()


// 방법 2. super 키워드로 상위클래스 생성자 선언 (객체) 나타내기
public class ParentBookstore{
	String name;
    int price;
 	// 상위클래스 내 생성자 있는 경우   
    public ParentBookstore (String name, int price){
    	this.name = name;
        this.price = price;
}
	public void Print(){
    	System.out.println("책 이름과 가격 : "+name+" "+price);
}

public class ChildBookstore extends ParentBookstore{
	// 자식 생성자 생성 후 반드시 자식 생성자 첫줄에 선언
	ChildBookstore (){
    	super("역행자", 19800);
}
public static void main (String[] args){
	ChildBookstore Child = new ChildBookstore();
    System.out.print("[구현 결과2] : ");
    Child.Print();
}

case 2를 살펴보면 super 사용은 다음과 같다.
만일 상위클래스에게 매개변수를 포함한 명시적 생성자 선언이 있었는데 하위클래스 생성자에서 super를 통해 호출해주지 않는 경우 컴파일 에러가 발생하고 하위클래스 내부 첫줄에 super를 작성해주어야만 컴파일 에러가 발생하지 않는다.

상속 종류로는 다음과 같다.

추가적인 상속정보 학습내용은 아래 글을 참고하였다
java class 상속

추가 학습 코드

class People{
	// 필드 정보
    String name;
    int age;
    
    // 메소드
    public void printMyself(){
    	System.out.println("이름 : " + name);
        System.out.println("나이 : " + age);
    }
}

// 하위클래스가 상위클래스 상속
class Students extend People{
	// 필드
    int korean_score;
    int math_score;
    int english_score;
    
	// 생성자
    Student(String name, int age, int kor_score, int mat_score, int eng_score){
    	super.name = name;
        super.age = age;
        this.korean_score = kor_score;
        this.math_score = mat.score;
        this.english_score = eng_score;
    }
    
    // 메소드
    public void printScore() {
    	System.out.println("국어성적 : " + korean_score);
        System.out.println("수학성적 : " + mat_score);
        System.out.println("영어성적 : " + eng_score);
    }
}   
profile
To be a DataScientist

0개의 댓글