NGMsoftware

NGMsoftware
로그인 회원가입
  • 매뉴얼
  • 학습
  • 매뉴얼

    학습


    Java Java vs C# (String, 문자열) - 12부

    페이지 정보

    본문

    안녕하세요. 소심비형입니다. 오늘은 문자열에 대해서 알아보도록 하겠습니다. 문자열의 경우 Java와 C#이 비슷합니다. 사용법도 유사하구요. 하지만, 언어의 차이에서 오는 미묘하게 다른 부분들도 존재합니다. 이 때문에 2개 언어를 동시에 사용할 때 약간의 혼란이 발생하기도 합니다. 알고 있는 내용도 무의식 중에 코딩하다보면 문자열 비교에 있어서 실수를 가끔하게 되죠. 디테일한 부분들은 Oracle이나 MSDN을 찾아보면서 해야겠지만, 기본적인 내용은 어느정도 숙지하는게 좋겠죠^^;

     

    아래는 기본적인 문자열에 대한 내용입니다.

    Java

    import java.util.*;
    
    public class StringTest {
    	public static void main(String[] args) {
    		// 문자열 결합
    		String name = "소심";
    		name = name + "비형";
    		name += "비형";
    		System.out.printf("name : %s", name);
    		System.out.println();
    		
    		// 문자열 비교
    		String 성별 = "남자";
    		String sex = "Male";
    		System.out.printf("sex == 남자 : %s", 성별 == new String("남자"));
    		System.out.println();
    		System.out.printf("sex.equals(\"남자\") : %s", 성별.equals(new String("남자")));
    		System.out.println();
    		System.out.printf("sex.equalsIgnoreCase(\"남자\") : %s", sex.equals("MALE"));
    		System.out.println();
    		System.out.printf("sex.compareTo(\"Male\") : %s", sex.compareTo("Male") == 0);
    		System.out.println();
    		System.out.printf("sex.substring(0, 1) : %s", sex.substring(0, 1));
    		System.out.println();
    		
    		// 날짜
    		Calendar calendar = Calendar.getInstance();
    		System.out.printf("%1$tA, %1$tB %1$td, %1$tY", calendar);
    		System.out.println();
    		System.out.printf("%1$TA, %1$TB %1$Td, %1$TY", calendar);
    		System.out.println();
    		System.out.printf("%1$ta, %1$tb %1$te, %1$ty", calendar);
    		System.out.println();
    		
    		// 날짜 포멧의 대, 소문자 표현을 확인하기 위해 로케일을 변경
    		Locale.setDefault(Locale.ENGLISH);
    		System.out.printf("%1$tA, %1$tB %1$td, %1$tY", calendar);
    		System.out.println();
    		System.out.printf("%1$TA, %1$TB %1$Td, %1$TY", calendar);
    		System.out.println();
    		System.out.printf("%1$ta, %1$tb %1$te, %1$ty", calendar);
    		System.out.println();
    		
    		// 조작 가능한 문자열
    		StringBuffer buffer = new StringBuffer("second ");
    		buffer.append("third ");
    		buffer.insert(0, "first ");
    		buffer.replace(6, 12, "SECOND");
    		System.out.println(buffer);
    		
    		// 이스케이프 문자열 처리
    		String path = "\\\\Korea\\Programer\\LaborUnion.java";
    		System.out.println(path);
    	}
    }

     

     

    위 코드를 실행하면 아래와 같은 결과를 확인할 수 있습니다.

    rEN1Jtt.png

     

     

    하이라이트 처리되어 있는 19와 21라인을 보면 "=="와 "equals"의 차이점을 알 수 있습니다. 이 차이에 대한 결과는 위 스크린샷의 1과 2입니다. 이런 차이가 발생되는 이유는 "=="는 참조 형식의 주소를 비교하고, "equals"는 참조 형식이 가지고 있는 값을 비교하기 때문입니다. 날짜의 경우 포멧이 이미 약속되어 있기 때문에, 자세한 내용은 Oracle에서 확인해야 합니다. 기본적으로 OS의 로케일을 따라가기 때문에 날짜가 한글로 표시됩니다. 날짜 포멧에서 지원하는 IgnoreCase를 확인하기 위해 부득이하게 로케일을 변경하고 같은 코드를 한번 더 출력했습니다. Java의 Text에 있는 SimpleDataFormat과 SimpleTimeZone을 이용하여 원하는 포멧으로 변경할 수 있습니다.

    q6qzIdA.jpg

     

     

    Java의 Date와 Calendar에 대해서 이야기 하자면 너무나도 많은 시간을 할애해야 합니다. 그 이유는 Date와 Calendar 객체는 다른 언어들에서 제공하는 날짜 타입과는 다르게 불변 객체가 아닙니다. 이는 심각한 오류를 유발할 수 있고 오류를 찾기도 어렵습니다. 흔히 하는 실수로 Calendar 객체를 전역 변수로 선언하고 여러 곳에서 가져다 쓴다는 점입니다. 로컬 변수라면야 문제가 발생하지 않겠지만, 전역 변수라면 어느 곳에서 변경이 일어나는지 알아채기는 쉽지 않죠. 이외에도 그레고리력으로 인한 문제와 썸머타임, 윤달, 윤초등등... 찾기 어려운 문제들에 봉착하게되면 맨붕이 오기 쉽상이죠-_-; 이런 문제제기는 아주 오래전부터 있어왔으며 이번 Java 8에서 새로운 날짜 타입을 도입함으로써 Java도 C#처럼 편하게 사용할 수 있게 되었습니다.

    C#

    using System;
    using System.Text;
    using System.Globalization;
    
    namespace ConsoleApp1
    {
        class Program
        {
            static void Main(string[] args)
            {
                // 문자열 결합            
                String name = "소심";
                // name = name + "비형";            
                name += "비형";
                Console.WriteLine($"name : {name}");
                
                // 문자열 비교            
                string 성별 = "남자"; string sex = "Male";
                Console.WriteLine($"sex == 남자 : {성별 == new string(new char[] { '남', '자' })}");
                Console.WriteLine($"sex.equals(\"남자\") : {성별.Equals(new string(new char[] { '남', '자' }))}");
                Console.WriteLine($"sex.ToUpper().Equals(\"MALE\") : {sex.ToUpper().Equals("MALE")}");
                Console.WriteLine($"sex.compareTo(\"Male\") : {sex.CompareTo("Male") == 0}");
                Console.WriteLine($"sex.substring(0, 1) : {sex.Substring(0, 1)}");
                
                // 날짜            
                DateTime datetime = DateTime.Now; 
                Console.WriteLine(datetime.ToString("MMMM dd, yyyy"));
                
                // 날짜 포멧의 대, 소문자 표현을 확인하기 위해 로케일을 변경       
                System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-US");
                Console.WriteLine(datetime.ToString("MMMM dd, yyyy"));
    
                // 조작 가능한 문자열         
                StringBuilder buffer = new StringBuilder("second "); 
                buffer.Append("third ");
                buffer.Insert(0, "first "); 
                buffer.Replace("second", "SECOND"); 
                Console.WriteLine(buffer);
    
                // 이스케이프 문자열 처리      
                String path = @"\\Korea\Programer\LaborUnion.java"; 
                Console.WriteLine(path); 
                Console.ReadLine();
            }
        }
    }

     

     

    C#의 결과는 아래와 같습니다. Java와 다른점은 "=="와 "Equals"가 똑같이 값 비교를 한다는 점입니다.

    1njVBbV.png

     

     

    1. C#의 경우에는 51번 라인과 같이 변수에 할당되는 문자열 앞에 @를 사용하여 이스케이프를 효율적으로 처리할 수 있습니다.

    2. 문자열을 비교할 때 Java는 equals() 메소드를 사용하지만, C#은 메소드외에도 ==, != 연산자를 사용하여 값 비교를 할 수 있습니다. 이런 차이점이 발생하는 이유는 문자열이 참조 타입이기 때문입니다.

     

    다음 시간에...

    • 네이버 공유하기
    • 페이스북 공유하기
    • 트위터 공유하기
    • 카카오스토리 공유하기
    추천0 비추천0

    댓글목록

    등록된 댓글이 없습니다.