자바 문자열, ArrayList, 메서드, 스태틱, Call By ?

0woy·2023년 5월 7일
0

LikeLion

목록 보기
1/6

📌 순천향대학교 멋쟁이 사자처럼 동아리 백엔드 트랙에서 배운 내용을 정리하여 올립니다.


📕 문자열

- 인스턴스(객체): 생성된 객체를 인스턴스라고 칭한다.
- 클래스: 클래스를 이용해 힙 영역에 새로운 인스턴스를 만들 수 있다.
- 인스턴스를 생성하면 서로 독립적인 메모리를 할당 받는다.(Static)

//예제
public static void main(String[] args){
	String a ="123";
	String b = new String("abc");
}
  • a와 같이 문자열 리터럴 방법으로 생성하면 문자열 상수 풀에 문자열이 저장된다.

  • b와 같이 New 키워드로 생성하는 경우, 인스턴스가 Heap 메모리 영역에 저장됨.
    이때 문자열이 같더라도 힙 영역에 여러개가 생성 되어 다른 참조 값을 가짐

문자열 상수풀?
-> Java 힙 영역에 존재하는 특수한 공간으로, 문자열 리터럴을 저장하는 용도로 사용된다.
문자열 리터럴이 생성될 때마다 JVM은 해당 문자열이 문자열 상수 풀에 존재하는지 확인함

public static void main(String[] args){
	String a = "Hello"
	String b = new String("Hello");
    String c = new String("Hello");
}

📖 String 내장 함수

- Length: 현재 문자열 길이 반환
- Equals: 두 문자여링 같은지 비교 후 결과 반환
- charAt: 해당 문자열의 index 위치에 있는 문자 한 개 반환
- SubString: 프로그래머가 지정한 위치의 문자열 반환

🥚 입력

public static void main(String[] args){
    String a = "1234567"

    System.out.println(a.length());			// length 예제   
    System.out.println(a.equals("123"));	// equals 예제
    System.out.println(a.charAt(2));		// charAt 예제
    System.out.println(a.subString(1,4));	// subString 예제
}

🍳 출력

7
False
3
234	// 1 ~(4-1)위치의 문자열 반환

📙 배열

  1. 코드영역: 실행할 프로그램의 코드를 올려 놓을 공간

  2. 데이터 영역: 프로그램이 종료될 때까지 유지해야 할 데이터를 저장할 공간
    전역변수 & Static 변수는 이곳에 저장됨

  3. 힙 영역: 사용자에 의해 동적으로 할당되고 해제되는 메모리 영역

    • 모든 Objcect(Integer, String, 배열 등)은 heap 영역에서 생성됨
    • 힙 영역에 있는 Object를 가리키는 참조형 변수스택 영역에 적재
    • 스택 영역과 다르게 보관되는 메모리가 호출이 끝나도 삭제되지 않음
    • 참조되지 않고 남은 고아 객체들은 Garbage Collector에 의해 청소됨
  4. 스택 영역: 함수 호출 시에 생성, 함수 호출이 완료되면 사라짐
    기본 자료형은 스택 영역에 실제 값을 저장

배열 변수는 참조 변수에 속함 -> 배열 변수는 Stack 영역에 저장됨.
배열도 객체이므로 영역에 생성
배열 변수는 힙 영역의 배열 객체 참조
int [] intArr = new int[5];

🥚 입력

public static void main(String[] args){
	String[] strArr = new String[3];
    strArr[0] ="Java";
    strArr[1] ="Java";
    strArr[2] = new String("Java");
    
    System.out.println(strArr[0]==strArr[1]);
    System.out.println(strArr[0]==strArr[2]);
    System.out.println(strArr[0].equals(strArr[2]));
}

🍳 출력

True
False
True

자바에서 문자열을 == 연산자로 비교하면, 두 개의 문자열이 메모리 상의 동일한 객체인지 비교.
- 동일한 문자열 리터럴를 참조하는 0,1을 비교하는 문장은 True
- New 키워드를 이용하면 새로운 객체를 생성하므로 False
- Equals는 메모리가 아닌 문자열을 비교하므로 True

기본 타입 배열과 참조 타입 배열의 차이점

  • 기본 타입 배열: 각 항목에 직접 값을 가짐
  • 참조 타입 배열: 각 항목에 객체의 메모리 주소를 가짐
    EX) String 배열의 항목도 String 변수와 동일하게 취급 되어야 함

📒 ArrayList

ArrayList와 배열의 차이점

1. 배열

  • 처음 선언한 배열의 크기는 변경X (정적 할당)
  • 메모리에 연속적 나열하여 할당
  • 하나의 데이터를 삭제하더라도 해당 Idx는 빈 공간

2. ArrayList
- 객체 배열을 구현한 클래스
- 리스트의 길이가 가변적(동적 할당)
- 데이터 사이 빈 공간 허용X
ArrayList<타입> 객체명 = new ArrayList<>();

📖 제네릭스

  • ArrayList에서 다룰 객체를 미리 명시해줌으로써 형 변환 하지 않고 ArrayList 사용O
  • int, double 등 기본 자료형은 객체가 아니므로 래퍼(Wrapper) 클래스를 사용해야함.
    Wrapper 클래스: 기본 자료타입을 객체로 다루기 위해 사용하는 클래스들'
  • 박싱: 기본 타입 -> 객체
  • 언박싱: 객체 -> 기본 타입
기본 타입(primitive type)래퍼 클래스(wrapper class)
byteByte
charCharacter
intInteger
floatFloat
doubleDouble
booleanBoolean
longLong
shortShort
// 예제
public static void main(String[] args){
	Integer num = new Integer(17);	// 박싱
    int n = num.intValue();			// 언박싱
}

📖 ArrayList 활용 예제

🥚 입력

public static void main(String[] args){
	ArrayList<String> str = new ArrayList<>();
    str.add("ralo");
    str.add("chanho");
    str.add(1,"paka");
    System.out.println(str.get(2));
    System.out.println(str.indexOf("chanho"));
}

🍳 출력

chanho
2

📗 메서드

다른 프로그래밍 언어에서 '함수'라고 불리는 것
반복되는 작업을 메서드를 통해 효율적으로 처리하기 위함

  • 매개변수: 메서드에 전달된 값을 저장하는 변수
  • 인수: 메서드에 전달하는 값

📖 메서드의 종류

  1. 입/출력이 모두 있는 메서드
int sum(int a, int b){return a+b;}
  1. 입/출력이 모두 없는 메서드
void Say(){System.out.println("Hello");}
  1. 출력만 있는 메서드
String Say(){return "Hello";}
  1. 입력만 있는 메서드
void sum(int a, int b)
{
	System.out.println("a+b="+(a+b));
}
  1. return을 통해 함수를 빠져나갈 수 있음
public class Sample(){
	void sayNick(String nick){
    	if("fool".equals(nick) return;
        System.out.println("나의 별명:"+nick);
    }
    public static void main(String[] args){
    	Sample s = new Sample();
        s.sayNick("angle");
        s.sayNick("fool");	// 출력되지 않음
        
    }
}

📘 전역변수 / 지역 변수 / Static 변수

전역 변수:데이터 영역 에 저장
지역 변수: 스택 영역 에 저장
Static 변수: 데이터 영역 에 저장
데이터 영역: 프로그램이 종료될 때 까지 유지해야 할 데이터 저장할 공간
스택 영역: 함수 호출시 생성 & 호출이 종료되면 사라짐

1) 전역 / 지역 변수 예제

class Ex_variable{
	
	int global;			// 전역 변수(객체 변수): 같은 클래스에서 호출 가능
    void method(){
    	int local = 0;	// 지역 변수: {} 안에 생성 되며, {}를 벗어나면 
    }					// method() 메서드가 끝나는 시점에서 바로 삭제
    
    void print(){
    	System.out.println(global);
        System.out.println(local);	// 에러
    }
}

2) Static

자바에서 Static 키워드를 사용한다는 것은 메모리에 한 번 할당되어
프로그램이 종료 될 때 해제됨을 의미.

# Static 변수 특징
- 클래스 변수, 객체에 소속된 멤버가 아닌 클래스에 고정된 멤버
- 객체를 생성하지 않아도 Static 차원에서 접근 가능

📖 Static VS Heap?

  1. Static
    • 주로 클래스 들이 할당
    • Garbage Collector 관여 X
    • 모든 객체가 메모리 공유
  2. Heap
    • 주로 객체 들이 할당
    • Garbage Collector 관여 O
    • 메모리 공유 X

📖 Static 예제

🥚 입력

public class LikeCount{
	int count=0;
    static int sCount=0;
    
    public LikeCount(){
    	this.count++;
        this.sCount++;
        System.out.println("count:"+count);
        System.out.println("sCount:"+sCount);        
    }
    
    public static void main(String[] args){
 		LikeCount lc1 = new LikeCount();
        LikeCount lc2 = new LikeCount();
    }
}

🍳 출력

count:1		// lc1
sCount:1	// lc1
count:1		// lc2
sCount:2	// lc2

📓 Call By Value & Reference

Call By Value(매개 변수로 값을 받음)

- 메서드 호출 시에 인자로 전달되는 값의 복사본 전달
- 메서드에서 인자의 값이 변경 돼도 호출된 측에서는 원래 값 유지

Call By Reference(매개 변수로 주소를 받음)

- 객체의 주소값이 인자로 전달
- 메서드 인자의 값이 변경되면 호출된 측에서도 변경된 값 사용

public class Main{
	
    // Call By Value
    public satatic void increment(int num)
    { num++; }
	
    // Call By Reference
    public static void changeAge(Person person)
    { person.setAge(person.getAge()+1); }
    
	public static void main(String[] args){
		int x =5;
    	increment(x);
    	System.out.println("x: "+x);	// 출력: x: 5
        
        Person person = new Person("John",30);
        chageAge(person);
        System.out.println("age: "+person.getAge()); //출력: age: 31
	}

}

📜 콘솔 입력 Scanner

자바에서 입력을 위해 제공해 주는 클래스
Scanner 객체 이름 = new Scanner(System.in);

Scanner 클래스 메서드기능
next()문자열 입력(띄어쓰기 X)
nextLine()문자열 입력(띄어쓰기 O)
nextByte()byte 타입 자료형 값 입력
nextInt()int 타입 자료형 값 입력
nextBoolean()boolean 타입 자료형 값 입력
nextShort()short 타입 자료형 값 입력
nextLong()Long 타입 자료형 값 입력
nextFloat()float 타입 자료형 값 입력
nextDouble()double 타입 자료형 값 입력

0개의 댓글